Конфигурация wcf maxStringContentLength, похоже, не работает

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

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

Ошибка предлагает увеличить 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>

person gleasonomicon    schedule 29.01.2011    source источник


Ответы (4)


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

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

person Peladao    schedule 29.01.2011

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

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

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

person D.Tiemstra    schedule 04.11.2011

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

    <webHttpBinding>         
    <binding  maxReceivedMessageSize="2147483647" > 
      <readerQuotas maxDepth="2147483647"
       maxStringContentLength="2147483647"
       maxArrayLength="2147483647"
       maxBytesPerRead="2147483647"
       maxNameTableCharCount="2147483647" />
    </binding>
  </webHttpBinding>
person Karthikeyan    schedule 25.06.2013
comment
Я не считаю эти максимальные значения правильными, я бы выбрал: MaxBufferSize = 2147483647, MaxBufferPoolSize = 524288, MaxReceivedMessageSize = 2147483647, ReaderQuotas = new XmlDictionaryReaderQuotas { MaxDepth = 32, MaxStringContentLength = 8192, MaxArrayLength = 16384, MaxBytesPerRead = 4096, MaxNameTableCharCount =1638 } - person DanielV; 28.09.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
}
person DanielV    schedule 28.09.2017