it-roy-ru.com

Ошибка "Максимальная квота длины строки содержимого (8192) при чтении данных XML" ошибка при отправке строки XML в WCF

Я работаю с приложением .NET, C #, которое намеревается отправить длинную строку 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" />

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

17
Pinaki Karuri

Вот статья на MSDN о Квоты для читателей .

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

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

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

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

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

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

10
Derek W

Я получил эту ошибку и решил, добавив это - свойство 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 поведениеConfiguration = "endpointbehaviour"

8
Lingaraj

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

    <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>
6
Ravi Kumar Kamboj

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

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

Обновление

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

5
Piotr Justyna

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

<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/

4
Rajkiran Sanchaniya

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

0
Luigi