Изменения, необходимые для использования web.config по умолчанию и увеличения maxStringContentLength - PullRequest
3 голосов
/ 17 февраля 2012

Мне нужно отправить много текста от одного из моих клиентов на мой сервер.Я знаю, что для этого нужно увеличить maxStringContentLength на сервере.

Я провел массу поисков по этому вопросу, и, похоже, все исправления для этого начинаются с шага 3 .

Я не могу понять,шаги 1 и 2 ...

Может кто-нибудь провести меня через это приятно и медленно.Учитывая мой Web.config ниже, как я могу установить maxStringContentLength?

Вот мой Web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>
</configuration>  

Справочная информация:

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Вам придется изменить свойства привязки , используемой в конечной точке службы. Так как вы не предоставили ничего в своем файле конфигурации, WCF 4.0 автоматически собирается добавить конечную точку по умолчанию для каждого контракта на обслуживание и базовый адрес , определенный на хосте. Если служба размещена в IIS, то базовым адресом является виртуальный каталог.

Связывания, используемые на конечных точках по умолчанию, определены в элементе <protocolMapping>. На уровне машины сопоставления:

<protocolMapping>
    <add scheme="http" binding="basicHttpBinding"/>
    <add scheme="net.tcp" binding="netTcpBinding"/>
    <add scheme="net.pipe" binding="netNamedPipeBinding"/>
    <add scheme="net.msmq" binding="netMsmqBinding"/>
</protocolMapping>

В вашем случае, если сопоставления по умолчанию не были переопределены, WCF создает конечную точку HTTP по умолчанию на основе виртуального каталога http://myserver/Orders, используя basicHttpBinding .

Вы можете изменить свойство maxStringContentLength для basicHttpBinding , предоставив конфигурацию связывания по умолчанию , которая является безымянной конфигурацией, которая будет применяться автоматически для всех конечных точек, использующих эту привязку.

Просто добавьте этот элемент в ваш Web.config в разделе <system.serviceModel>:

<bindings>
    <basicHttpBinding>
         <binding maxReceivedMessageSize="SomeIntegerValue">
             <readerQuotas maxStringContentLength="SomeIntegerValue" />
        </binding>
    </basicHttpBinding>
</bindings>

Обратите внимание, что MSDN рекомендует установить для свойств maxStringContentLength и maxReceivedMessageSize одинаковое значение :

Значение атрибута maxStringContentLength не может быть больше чем значение атрибута maxReceivedMessageSize. Мы рекомендуем что значения двух атрибутов одинаковы.

Если это не сработает, вы можете явно указать, какую привязку использовать для конечной точки HTTP по умолчанию, добавив элемент <protocolMapping> в ваш файл Web.config и соответствующим образом изменить конфигурацию привязки:

<protocolMapping>
    <add scheme="http" binding="basicHttpBinding"/>
</protocolMapping>
2 голосов
/ 17 февраля 2012

Чтобы привести пример того, что я говорил в своем комментарии, сделайте следующее в разделе <system.serviceModel> вашего web.config.

Сначала укажите конфигурацию привязки в вашем конфигурационном файле - например:

<bindings>
  <wsHttpBinding>
    <binding name="MyWsHttpBinding" closeTimeout="00:05:00" 
             openTimeout="00:05:00" 
             receiveTimeout="00:05:00" 
             sendTimeout="00:05:00" 
             transactionFlow="false" 
             hostNameComparisonMode="StrongWildcard" 
             maxBufferPoolSize="524288" 
             maxReceivedMessageSize="5242880">
      <readerQuotas maxDepth="32" 
                    maxStringContentLength="5242880" 
                    maxArrayLength="16384" 
                    maxBytesPerRead="4096" 
                    maxNameTableCharCount="16384" />
    </binding>
  </wsHttpBinding>
</bindings>

Далее вам нужно назначить вышеуказанную конфигурацию для вашей конечной точки:

<services>
  <service behaviorConfiguration="MyServiceBehavior" name="MyService">
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="MyWsHttpBinding"
              contract="MyCompany.IMyService" />                       
  </service>
</services>

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

Кроме того, ознакомьтесь со следующей статьей, касающейся конечных точек и привязок по умолчанию для WCF 4.0 - Введение разработчика в Windows Communication Foundation 4

...