WCF: maxStringContentLength всегда установлен на 8192

Мне нужно изменить maxStringContentLength на значение больше, чем 8192, но не удалось это сделать. Моя служба WCF сгенерирует исключение, если объем полученных данных превышает 8192 байта. Я исчерпал свои поиски, и ничто, кажется, не помогает. Следует отметить, что исключение исходит от сервера. Забудьте о клиенте, потому что я вижу исключение, сгенерированное прямо из WCF на сервере. Вот мои настройки web.config:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="DevServiceBehavior" >
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service name="DeveloperService"
             behaviorConfiguration="DevServiceBehavior" >
      <endpoint address="mtom"
                binding="basicHttpBinding"
                bindingConfiguration="Binding_DevService"
                contract="DeveloperService">
        <identity>
          <dns value="localhost"/>
        </identity>
      </endpoint>
      <endpoint contract="IMetadataExchange"
                binding="mexHttpBinding"
                address="mex" />
    </service>
  </services>
  <bindings>
    <basicHttpBinding>
      <binding name="Binding_DevService"
               messageEncoding="Mtom"
               openTimeout="00:02:00"
               sendTimeout="00:02:00"
               maxBufferPoolSize ="41943040"
               maxBufferSize="2147483647"
               maxReceivedMessageSize="2147483647">
        <readerQuotas maxDepth="500"
                      maxArrayLength="20000000"
                      maxStringContentLength="20000000" />
      </binding>
    </basicHttpBinding>
  </bindings>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                              multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

2 ответа

Решение

По умолчанию последняя версия WCF фактически устанавливает значения по умолчанию, а json используется по умолчанию. Что было неясно, так это то, какой тип привязки по умолчанию использовал WCF. Оказывается, это webHttpBinding. В Интернете вы также увидите множество примеров, демонстрирующих атрибуты, применяемые к методу службы, например, [WebGet]. Метод не требует никаких атрибутов вообще. Чтобы maxStringContentLength вступил в силу, вам нужно правильно настроить привязку и поведение. Вот правильные записи в файле web.config:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="jsonBehavior">
        <enableWebScript />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="DevServiceBehavior" >
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service name="DeveloperService" behaviorConfiguration="DevServiceBehavior" >
      <endpoint address="" binding="webHttpBinding" contract="DeveloperService" bindingConfiguration="webHttpBindingDev" behaviorConfiguration="jsonBehavior">
        <identity>
          <dns value="localhost"/>
        </identity>
      </endpoint>
      <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
    </service>
  </services>
  <bindings>
    <webHttpBinding>
      <binding name="webHttpBindingDev">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"  maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      </binding>
    </webHttpBinding>
  </bindings> 
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

Обновите свой клиентский конфиг тоже. Установите квоту Reader в и ее атрибуты в разделе привязки.

Другие вопросы по тегам