采用默认web.config并增加maxStringContentLength所需的更改

时间:2012-02-17 19:35:28

标签: .net wcf .net-4.0 web-config

我需要从我的一个客户端向我的服务器发送大量文本。为此,我知道我需要在服务器上增加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 个答案:

答案 0 :(得分:4)

您必须修改服务端点上使用的绑定的属性。由于您未在配置文件中提供任何内容,因此WCF 4.0为automatically going to add a default endpoint for each service contract and base address defined in the host.如果服务托管在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将使用basicHttpBinding基于http://myserver/Orders虚拟目录创建默认HTTP端点。

您可以通过提供默认绑定配置,即无名配置来修改basicHttpBindingmaxStringContentLength属性,该配置将自动生成使用该绑定应用于所有端点。

只需将此元素添加到<system.serviceModel>部分中的Web.config:

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

请注意,MSDN recommends要将maxStringContentLengthmaxReceivedMessageSize属性设置为相同的值

  

maxStringContentLength属性的值不能更大   而不是maxReceivedMessageSize属性的值。我们推荐   这两个属性的值是相同的。

如果这不起作用,您可以通过在Web.config中添加<protocolMapping>元素来显式定义要用于默认HTTP端点的绑定,并相应地调整绑定配置:

<protocolMapping>
    <add scheme="http" binding="basicHttpBinding"/>
</protocolMapping>

答案 1 :(得分:2)

要举例说明我在评论中所说的内容,请在web.config的<system.serviceModel>部分中执行以下操作。

首先,在配置文件中指定绑定配置 - 例如:

<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的默认端点和绑定的文章 - A Developer's Introduction to Windows Communication Foundation 4