2009-07-15 2 views
2

У меня есть длинный XML-файл содержимое файла ниже:FaultException при отправке большого количества данных в WCF?

<?xml version="1.0" encoding="utf-8"?> 
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">http://example.org/person</a:Action> 
    </s:Header> 
    <s:Body> 
     <OrderDataBDO xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.datacontract.org/2004/07/BasWare.OM.BusinessDataObjects"> 
      <selected i:type="x:boolean" xmlns="">false</selected> 
      <isSaved i:type="x:boolean" xmlns="">false</isSaved> 
      <metadata i:nil="true" xmlns=""/> 
      <hasUnsavedValues i:type="x:boolean" xmlns="">false</hasUnsavedValues> 
      <hasChanged i:type="x:boolean" xmlns="">false</hasChanged> 
      <defaultResourceId i:type="x:string" xmlns="">BWRc.OM.BUSINESSOBJECTS.ORDERDATABDO.ORDER_DATA</defaultResourceId> 
      <_x0031_ xmlns:d4p1="http://schemas.datacontract.org/2004/07/BasWare.ProductFramework.BDOFramework" i:type="d4p1:ADate" xmlns=""> 
       <_x0031_ i:type="x:boolean">false</_x0031_> 
       <_x0032_ i:type="x:boolean">false</_x0032_> 
       <_x0033_ i:type="x:boolean">false</_x0033_> 
       <_x0034_ i:nil="true"/> 
       <_x0035_ i:type="x:boolean">true</_x0035_> 
       <_x0036_ i:type="x:dateTime">1753-01-01T12:00:00</_x0036_> 
       <_x0037_ i:type="x:string">d</_x0037_> 
       <_x0038_ i:type="x:string">ActualDeliveryDate</_x0038_> 
      </_x0031_> 
      <_x0032_ xmlns:d4p1="http://schemas.datacontract.org/2004/07/BasWare.ProductFramework.BDOFramework" i:type="d4p1:AString" xmlns=""> 
       <_x0031_ i:type="x:boolean">false</_x0031_> 
       <_x0032_ i:type="x:boolean">false</_x0032_> 
       <_x0033_ i:type="x:boolean">false</_x0033_> 
       <_x0034_ i:nil="true"/> 
       <_x0035_ i:type="x:boolean">true</_x0035_> 
       <_x0036_ i:type="x:string"/> 
       <_x0037_ i:nil="true"/> 
       <_x0038_ i:type="x:string">BuyerCode</_x0038_> 
      </_x0032_> 
      <_x0033_ xmlns:d4p1="http://schemas.datacontract.org/2004/07/BasWare.ProductFramework.BDOFramework" i:type="d4p1:AID" xmlns=""> 
       <_x0031_ i:type="x:boolean">false</_x0031_> 
       <_x0032_ i:type="x:boolean">false</_x0032_> 
       <_x0033_ i:type="x:boolean">false</_x0033_> 
       <_x0034_ i:nil="true"/> 
       <_x0035_ i:type="x:boolean">true</_x0035_> 
       <_x0036_ i:type="x:string"/> 
       <_x0037_ i:nil="true"/> 
       <_x0038_ i:type="x:string">BuyerId</_x0038_> 
      </_x0033_> 
      <!--etc--> 
      <_x0034_6 xmlns:d4p1="http://schemas.datacontract.org/2004/07/BasWare.ProductFramework.BDOFramework" i:type="d4p1:AMoney" xmlns=""> 
       <_x0031_ i:type="x:boolean">false</_x0031_> 
       <_x0032_ i:type="x:boolean">false</_x0032_> 
       <_x0033_ i:type="x:boolean">false</_x0033_> 
       <_x0034_ i:nil="true"/> 
       <_x0035_ i:type="x:boolean">true</_x0035_> 
       <_x0036_ i:type="x:decimal">0</_x0036_> 
       <_x0037_ i:type="x:string">N2</_x0037_> 
       <_x0038_ i:type="x:string">TaxSum</_x0038_> 
      </_x0034_6> 
      <_x0034_7 xmlns:d4p1="http://schemas.datacontract.org/2004/07/BasWare.ProductFramework.BDOFramework" i:type="d4p1:AString" xmlns=""> 
       <_x0031_ i:type="x:boolean">false</_x0031_> 
       <_x0032_ i:type="x:boolean">false</_x0032_> 
       <_x0033_ i:type="x:boolean">false</_x0033_> 
       <_x0034_ i:nil="true"/> 
       <_x0035_ i:type="x:boolean">true</_x0035_> 
       <_x0036_ i:type="x:string"/> 
       <_x0037_ i:nil="true"/> 
       <_x0038_ i:type="x:string">Text1</_x0038_> 
      </_x0034_7> 
      <_x0034_8 xmlns:d4p1="http://schemas.datacontract.org/2004/07/BasWare.ProductFramework.BDOFramework" i:type="d4p1:AString" xmlns=""> 
       <_x0031_ i:type="x:boolean">false</_x0031_> 
       <_x0032_ i:type="x:boolean">false</_x0032_> 
       <_x0033_ i:type="x:boolean">false</_x0033_> 
      </_x0034_8> 
     </OrderDataBDO> 
    </s:Body> 
</s:Envelope> 
+0

Почему вы считаете нужным опубликовать сообщение целиком? –

+0

Итак, в чем проблема? Пожалуйста, опубликуйте полное исключение. –

+0

спасибо Джон, Джон может у вас создать образец приложения wcf с одним методом, который принимает один параметр строки и печатает его. Затем от клиента, пожалуйста, передайте вышеприведенный xml, который я опубликовал, и позвоните методу в сервисе, вы увидите исключение и, возможно, получите больше информации о моей проблеме. Попробуйте. –

ответ

2

Вам необходимо установить различные параметры - поиграть со значениями и посмотреть, какая работа.

Прежде всего, используйте все необходимые привязки и настройте <readerQuotas> (maxStringContentLength, maxArrayLength, maxNameTableCharCount) - если это работает, отлично!

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="LargeMessages"> 
      <readerQuotas maxDepth="32" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" 
      maxBytesPerRead="4096" 
      maxNameTableCharCount="2147483647" /> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    </system.serviceModel> 

Если это не решит вашу проблему, вам нужно создать свой собственный привязки в конфигурации, и установить ограничения на уровне сообщений, а также - что-то вроде этого:

<system.serviceModel> 
    <bindings> 
     <customBinding> 
     <binding name="ExtraLargeMessages"> 
      <textMessageEncoding> 
      <readerQuotas maxDepth="32" 
       maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" 
       maxBytesPerRead="4096" 
       maxNameTableCharCount="2147483647" /> 
      </textMessageEncoding> 
      <httpsTransport 
       maxBufferPoolSize="1048576" 
       maxReceivedMessageSize="1048576" 
       maxBufferSize="1048576"/> 
     </binding> 
     </customBinding> 
    </bindings> 
    </system.serviceModel> 

Надеюсь, это поможет.

Марк

UPDATE:
Я бы tryto добавить поведение к службе, а затем вызвать метод снова.

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="DetailedDebug" > 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="yourService" behaviorConfiguration="DetailedDebug"> 
     ..... 
     </service> 
    </services> 
    </system.serviceModel> 

Теперь вы должны получить подробную информацию об исключении на своем клиенте - можете ли вы рассказать нам, что это такое? Может быть, это что-то совершенно другое .......

Marc

+0

спасибо marc_s, я пробовал все настройки, но он не работает. –

+0

обновлен с поведением «serviceDebug», чтобы узнать, что такое ошибка ДЕЙСТВИТЕЛЬНО. –

0

Измените ваш Max Message Size (например, в зависимости от вашего связывания) на клиенте и сервере как described here.

Что-то еще может пойти не так. Можете ли вы enable tracing для WCF и использовать trace log viewer, чтобы сузить исключение?

+0

я изменил настройки, как показано ниже: , но все та же ошибка. –

+0

Это чуть более 30 тыс. Данных - не очень высокие значения ..... –

+0

даже с 2147483647значением он не работает. –

0

Может быть, это количество объектов: попробуйте добавить что-то вроде этого

<serviceBehaviors> 
    <behavior name="PutTheNameOfYourBehaviorHere"> 
     <dataContractSerializer maxItemsInObjectGraph="10000000" /> 
    </behavior> 
    </serviceBehaviors> 

в ваш конфигурационный файл.

+0

благодарит Giulio, Giulio может у вас создать образец приложения wcf с одним методом, который принимает один параметр строки и печатает его. Затем от клиента, пожалуйста, пропустите вышеуказанный xml, который я опубликовал, и позвоните методу в сервисе, и вы увидите исключение и, возможно, получите больше информации о моей проблеме. Попробуйте. –

+0

следующее сообщение: Formatter выдал исключение при попытке десериализации сообщения: при попытке десериализации параметра tempuri.org/:msg произошла ошибка. Сообщение InnerException было «Ошибка десериализации объекта типа System.IO.MemoryStream. Максимальная длина длины массива (16384) была превышена при чтении XML-данных. Эта квота может быть увеличена путем изменения свойства MaxArrayLength объекта XmlDictionaryReaderQuotas, используемого при создании XML-считывателя. Строка 1, позиция 44708. '. Дополнительную информацию см. В InnerException. –

Смежные вопросы