Конфигурация wcf maxStringContentLength не работает - PullRequest
4 голосов
/ 29 января 2011

Мы пытаемся отправить большую строку XML в метод службы в WCF, и мы получаем ошибку

Превышена квота максимальной длины содержимого строки (8192) при чтении XMLdata.

Ошибка предполагает увеличение maxstringcontentlength, хотя мы не были уверены, должны ли мы делать это на стороне клиента, на стороне сервера или на обоих.Мы пытались включить оба, но, похоже, все еще получаем ошибку.Я собираюсь опубликовать клиентские и сервисные конфиги ниже.Я предполагаю, что есть проблема с одним или обоими из них, препятствующими тому, чтобы это работало.

Любые предложения?

Клиент:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_ITESTService" 
                closeTimeout="00:01:00" openTimeout="00:01:00" 
                receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" 
                hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288"  
                maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" 
                transferMode="Buffered" useDefaultWebProxy="true">
               <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
                    maxArrayLength="2147483647" maxBytesPerRead="4096" 
                    maxNameTableCharCount="2147483647" />
               <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint name="BasicHttpBinding_ITESTService"  
            address="http://localhost/TESTService.svc" 
            binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_ITESTService" 
            contract="TESTService.ITESTService" />
    </client>
</system.serviceModel>

Сервер:

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
          <binding
              name="BasicHttpBinding_Service1"
              maxBufferSize="2147483647"
              maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" 
              maxStringContentLength="2147483647" maxArrayLength="2147483647"
              maxBytesPerRead="4096" maxNameTableCharCount="2147483647" />
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
       <service name="TESTService">
          <endpoint name="BasicHttpBinding_Service1"
              address="http://localhost/TESTService.svc"
              binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_Service1"
              contract="ITESTService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Ответы [ 4 ]

2 голосов
/ 04 ноября 2011

Попробуйте добавить привязку «по умолчанию» (без указания имени).Добавьте настройки readerQuota к этой привязке.

Затем вы даже можете удалить настройки readerQuota из именованной привязки, которую вы фактически используете.

Это сработало для меня (хотя я не уверен, почему readerQuotas на правильномименованные привязки игнорируются WCF)

1 голос
/ 25 июня 2013

опция связывания по умолчанию работала для меня. Я пытался настроить значение maxStringContentLength в названном WebHttpBinding, но по какой-то причине оно не было обнаружено WCF. наконец, я следил за работой вокруг D.Tiemstra, затем она начала работать.

    <webHttpBinding>         
    <binding  maxReceivedMessageSize="2147483647" > 
      <readerQuotas maxDepth="2147483647"
       maxStringContentLength="2147483647"
       maxArrayLength="2147483647"
       maxBytesPerRead="2147483647"
       maxNameTableCharCount="2147483647" />
    </binding>
  </webHttpBinding>
0 голосов
/ 28 сентября 2017

Я бы использовал эти значения для конфигурации WCF (программно):

Security = { Mode = SecurityMode.None},
CloseTimeout = TimeSpan.MaxValue,
OpenTimeout = TimeSpan.MaxValue,
SendTimeout = TimeSpan.FromMinutes(5),
ReceiveTimeout = TimeSpan.FromMinutes(5),
MaxBufferSize = 2147483647,
MaxBufferPoolSize = 524288,
MaxReceivedMessageSize = 2147483647,
ReaderQuotas = new XmlDictionaryReaderQuotas
{
   MaxDepth = 32,
   MaxStringContentLength = 8192,
   MaxArrayLength = 16384,
   MaxBytesPerRead = 4096,
   MaxNameTableCharCount =1638
}
0 голосов
/ 29 января 2011

Этот поток подробно объясняет, как правильно задать параметры привязки на сервере и клиенте для изменения MaxStringContentLength.

Этот другой поток также дает четкий и эффективный ответ по использованию считывателя Quotas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...