WCF: maxStringContentLength всегда установлен на 8192 - PullRequest
14 голосов
/ 15 августа 2011

Мне нужно изменить значение 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 ]

19 голосов
/ 17 августа 2011

По умолчанию последняя версия 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>
4 голосов
/ 16 августа 2011

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

...