Превышена квота на максимальную длину содержимого строки (8192) при чтении ошибки данных XML при отправке строки XML в WCF

Я работаю с приложением .NET, С#, которое намеревается отправить длинную строку XML методу службы WCF для дальнейшей работы. Когда мое приложение пытается отправить строку XML в службу WCF во время выполнения, я получаю сообщение об ошибке:

"The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:strProdUserDataXML. The InnerException message was 'There was an error deserializing the object of type System.String. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 131, position 57.'. Please see InnerException for more details."

На моей стороне приложения web.config я написал «привязку» и «конечную точку» как:

<binding name="EndPointHTTPGenericPortal" closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    <security mode="None">
    <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    </binding>

    <endpoint address="http://192.168.140.40/WcfGenericPortal_Service/Service1.svc" binding="basicHttpBinding" bindingConfiguration="EndPointHTTPGenericPortal" contract="IService1" name="EndPointHTTPGenericPortal" behaviorConfiguration="Graph" />

Если какое-либо тело может помочь мне решить эту ошибку, я буду очень признателен. Спасибо всем заранее.


person Pinaki Karuri    schedule 27.03.2013    source источник
comment
И какая у вас веб-конфигурация на стороне сервера?   -  person Alex    schedule 27.03.2013
comment
Каково значение максимальной квоты длины строкового содержимого на стороне сервера?   -  person Jocke    schedule 27.03.2013
comment
Вот связанный вопрос и ответ stackoverflow. ком/вопросы/6917061/   -  person Jocke    schedule 27.03.2013
comment
Привет Voo & Jocke, спасибо за ваш ответ. конфигурация на стороне сервера: 'имя привязки=EndPointHTTPGenericPortal maxBufferSize=2147483647 maxReceivedMessageSize=2147483647 openTimeout=00:30:00 closeTimeout=00:30:00 sendTimeout=00:30:00 receiveTimeout=00:10:00› ‹режим безопасности = Нет/› ‹/binding›'   -  person Pinaki Karuri    schedule 27.03.2013
comment
где ваш узел «readerQuotas»?   -  person Piotr Justyna    schedule 27.03.2013
comment
Многие здесь просто используют решение грубой силы, которое заключается в том, чтобы установить все значения конфигурации на максимум 2 ГБ (2147483647 байт), но имейте в виду, что это может сделать вас уязвимыми для DoS-атак и т. д. Это будет работать, но есть это причина, по которой значения по умолчанию установлены так низко по сравнению с ним.   -  person Derek W    schedule 17.08.2013
comment
Что касается моего предыдущего комментария - извините, некоторые из них являются символьными, значениями длины массива и значением глубины узла, а не просто значениями байтов в настройках конфигурации квоты чтения.   -  person Derek W    schedule 17.08.2013
comment
У меня такая же проблема. за исключением того, что в моем случае это происходит только на 1 из 4 компьютеров разработчиков, которые являются компьютерами производителя Dell, которые имеют одинаковые модели. мы все используем одну и ту же визуальную студию, и только у одного парня она падает, когда мы все запускаем одно и то же решение, которое я сделал. это на SVN такой же точный код. все работают на ЛЮБОМ процессоре.   -  person Franck    schedule 02.01.2014
comment
пожалуйста, отметьте принятый ответ   -  person Leandro Bardelli    schedule 15.07.2014
comment


Ответы (6)


Вот статья в MSDN о квотах чтения.

Похоже, что одна из квот чтения на стороне вашего сервера превышена.

В частности, превышено значение maxStringContentLength. Значение по умолчанию — 8192 символа для maxStringContentLength, которое, как описано в сообщении об ошибке, превышено.

Но, возможно, это не лучший подход, чтобы просто увеличить все значения до максимума 2147483647, как предлагают некоторые другие.

Как написано в документации MSDN, которую я связал:

Ограничения сложности обеспечивают защиту от атак типа «отказ в обслуживании» (DOS), которые пытаются использовать сложность сообщения для связывания ресурсов обработки конечной точки. Другие ограничения сложности включают такие элементы, как максимальная глубина элемента и максимальная длина строкового содержимого в сообщении.

В сочетании с тем фактом, что в настоящее время для параметра Режим безопасности установлено значение Нет, возможно, вы настраиваете себя на некоторые проблемы.

person Derek W    schedule 17.08.2013
comment
Спасибо Дерек В. за вашу помощь. Это помогло мне решить проблему. Я установил максимальное значение 2147483647, и это сработало. - person Pinaki Karuri; 31.08.2013

Я получил эту ошибку и решил ее, добавив это свойство MaxItemsInObjectGraph для службы как в конфигурации клиента, так и в конфигурации сервера.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

серверная часть

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="Service.Service1Behavior">
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </behavior>
</system.serviceModel>

Сторона клиента

<behaviors >
  <endpointBehaviors>
    <behavior name="endpointbehaviour">
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

и не забудьте применить это поведение к EndPoint behaviorConfiguration="endpointbehaviour"

person Lingaraj    schedule 27.03.2013
comment
Я провожу бесчисленные часы, чтобы устранить проблему. Ваше решение помогло мне исправить это, спасибо - person mxasim; 09.09.2013

Попробуйте установить следующие вещи в привязках.

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
    maxArrayLength="2147483647" maxBytesPerRead="2147483647"
    maxNameTableCharCount="2147483647" />

Это решило мою проблему. Для получения дополнительной информации перейдите по следующей ссылке: http://blogfornet.com/2013/08/the-maximum-string-content-length-quota-8192-has-been-exceeded-while-reading-xml-data/

person Rajkiran Sanchaniya    schedule 17.08.2013
comment
Теперь эта ссылка ведет на удерживающую страницу. - person Nigel Ellis; 13.08.2015

Привязка на стороне клиента

    <system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService11" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"
messageEncoding="Text">
<readerQuotas maxDepth="128" maxStringContentLength="2147483647"
maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>

<behaviors>
<endpointBehaviors>
<behavior name="KAMServiceDistributor">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:1234/xxxx/Service.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService11"
contract="yourservice namespae" name="AnyName" />
</client>
</system.serviceModel>

Файл конфигурации службы:

<system.serviceModel>
<behaviors>


<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceMetadata httpGetEnabled="true" />
<dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding <b>maxReceivedMessageSize="2147483647"</b>>
<readerQuotas maxDepth="128" maxStringContentLength="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehaviour" name="Service">
<endpoint binding="basicHttpBinding" contract="IService" />
</service>
</services>
</system.serviceModel>
person Ravi Kumar Kamboj    schedule 30.10.2014
comment
После фильтрации всех ответов ваш ответ сработал для меня ... миллион благодаря вам. - person Nagendra; 23.09.2015
comment
Да, этот ответ самый полезный среди других, потому что он показывает, где разместить настройки квот чтения! - person opewix; 19.11.2015

Пинаки Карури,

длина квот зависит не только от конфигурации клиента, но и от конфигурации сервера. Пожалуйста, опубликуйте файл web.config вашего сервера WCF, чтобы мы могли пролить свет на проблему. Есть вероятность, что у вас уже установлена ​​квота для 8192, поэтому самым быстрым способом для вас было бы найти и увеличить ее значение.

Обновить

Насколько я вижу, в файле web.config вашего сервера отсутствует узел readerQuotas, поэтому для MaxStringContentLength установлено значение по умолчанию (8192). Для получения дополнительной информации перейдите по этой ссылке: http://msdn.microsoft.com/en-us/library/system.xml.xmldictionaryreaderquotas.maxstringcontentlength.aspx

person Piotr Justyna    schedule 27.03.2013
comment
Привет Петр Юстьяна, Спасибо за ваш ответ, конфигурация сервера: 'имя привязки = EndPointHTTPGenericPortal maxBufferSize = 2147483647 maxReceivedMessageSize = 2147483647 openTimeout = 00:30:00 closeTimeout = 00:30:00 sendTimeout = 00:30:00 ReceiveTimeout = 00 :10:00› ‹режим безопасности=Нет/› ‹/привязка›' - person Pinaki Karuri; 27.03.2013
comment
Пожалуйста, прочитайте мой обновленный ответ и мой последний комментарий под вашим вопросом. - person Piotr Justyna; 27.03.2013
comment
Спасибо Петр Юстьяна, сработало!!!!! Вы решили это так легко.. Большое вам спасибо, ваша ссылка помогла мне решить ее так легко, в то время как это становилось для меня кошмаром. - person Pinaki Karuri; 27.03.2013

Убедитесь, что ваша целевая платформа для клиента такая же, как у службы. У меня была эта проблема, и я пробовал все вышеперечисленные исправления, но это не сработало. Проверил свойства, проверил целевую структуру и изменил ее.

person Luigi    schedule 28.05.2014