Подтвердить что ты не робот

"Максимальная длина длины строки содержимого (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" />

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Update

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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