WCF - 如何增加邮件大小配额

时间:2009-05-19 18:04:02

标签: .net asp.net wcf .net-3.5

我有一个WCF服务,它从数据库向客户端返回1000条记录。我有一个ASP.NET WCF客户端(我在asp.net Web应用程序项目中添加了服务引用以使用WCF)。

运行客户端应用程序时收到以下消息:

  

传入邮件的最大邮件大小限额(65536)   超标。要增加配额,请使用   MaxReceivedMessageSize属性   适当的绑定元素。

有任何帮助吗?如何增加邮件大小配额?

13 个答案:

答案 0 :(得分:571)

您需要这样的内容来增加 App.config Web.config 文件中的邮件大小配额:

<bindings>
    <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000" 
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
            <readerQuotas maxDepth="32" 
                 maxArrayLength="200000000"
                 maxStringContentLength="200000000"/>
        </binding>
    </basicHttpBinding>
</bindings>

并在端点配置中使用绑定名称,例如

...
bindingConfiguration="basicHttp"
...

值的理由很简单,它们足以容纳大多数消息。您可以调整该数字以满足您的需求。低默认值基本上是为了防止DOS类型的攻击。使其成为20000000将使分布式DOS攻击有效,默认大小为64k将需要大量客户端来支持大多数服务器。

答案 1 :(得分:145)

如果您在使用WCF测试客户端时仍然收到此错误消息,那是因为客户端具有单独的 MaxBufferSize 设置。

要解决此问题:

  1. 右键单击树底部的配置文件节点
  2. 选择使用SvcConfigEditor编辑
  3. 将显示可编辑设置列表,包括MaxBufferSize。

    注意: 默认情况下,自动生成的代理客户端也会将MaxBufferSize设置为65536.

答案 2 :(得分:90)

如果要动态创建WCF绑定,请使用以下代码:

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = Int32.MaxValue;
httpBinding.MaxBufferSize = Int32.MaxValue;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = Int32.MaxValue;

答案 3 :(得分:43)

WCF测试客户端拥有自己的客户端配置。

运行测试客户端并滚动到底部。 如果双击“配置文件”节点,您将看到XML表示。正如您所见,maxReceivedMessageSize65536

要编辑此项,请右键单击“配置文件”树节点,然后选择“使用SvcConfigEditor编辑”。 编辑器打开时展开Bindings并双击自动生成的绑定。

您可以在此处修改所有属性,包括maxReceivedMessageSize。完成后,单击文件 - 保存

最后,当您返回WCF测试客户端窗口时,请单击工具 - 选项

注意取消选中启动服务时始终重新生成配置

答案 4 :(得分:18)

我找到了简单的方法

  

---右键单击webconfig或app配置文件,然后单击EDIT WCF CONFIGURATION并选择bingdigs ans选择yore service and right   side show maxReciveMessageSize给出一个大数字---

答案 5 :(得分:8)

我解决了这个问题......如下

    <bindings>
  <netTcpBinding>
    <binding name="ECMSBindingConfig" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647" portSharingEnabled="true">
      <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
          maxStringContentLength="2147483647" maxDepth="2147483647"
          maxBytesPerRead="2147483647" />
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="ECMSServiceBehavior">
      <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceTimeouts transactionTimeout="00:10:00" />
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100"
        maxConcurrentInstances="100" />
    </behavior>
  </serviceBehaviors>
</behaviors>

答案 6 :(得分:8)

我在项目中使用CalculateRoute()在Bing Maps WPF上解决了我的问题。 我的解决方案是在“customBinding”部分的属性“httpTransport”上设置maxReceivedMessageSize和maxReceivedMessageSize。

我在applications.config文件(es.myApp.config)中设置了这个配置:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IGeocodeService" />
            <binding name="BasicHttpBinding_IRouteService" />
        </basicHttpBinding>
        <customBinding>
            <binding name="CustomBinding_IGeocodeService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
            <binding name="CustomBinding_IRouteService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="CustomBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
            contract="BingServices.IRouteService" name="BasicHttpBinding_IRouteService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
            contract="BingServices.IRouteService" name="CustomBinding_IRouteService" />
    </client>
</system.serviceModel>

答案 7 :(得分:6)

  

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000"          maxBufferPoolSize="20000000">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="false"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<client>
  <endpoint
            binding="wsHttpBinding"
            bindingConfiguration="wsHttpBinding_Username"
            contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType"
            name="ServicesFacadeEndpoint" />
</client>

答案 8 :(得分:4)

根据我的经验考虑另一件重要的事情......

我强烈建议不要最大化maxBufferPoolSize,因为池中的缓冲区永远不会释放,直到app-domain(即应用程序池)循环使用。

高流量时段可能会导致大量内存被使用而且从未被释放。

此处有更多详情:

答案 9 :(得分:4)

对我来说,我要做的就是将maxReceivedMessageSize="2147483647"添加到客户端app.config中。服务器保持不变。

答案 10 :(得分:3)

不要忘记执行入口点的app.config,而不是管理Web服务调用的类库项目中的app.config(如果有的话)。

例如,如果在运行单元测试时遇到错误,则需要在测试项目中设置适当的配置。

答案 11 :(得分:3)

对于 HTTP:

<bindings>
  <basicHttpBinding>
    <binding name="basicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000" 
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="200" 
             maxArrayLength="200000000"
             maxBytesPerRead="4096"
             maxStringContentLength="200000000"
             maxNameTableCharCount="16384"/>
    </binding>
  </basicHttpBinding>
</bindings>

对于 TCP:

<bindings>
  <netTcpBinding>
    <binding name="tcpBinding"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="200"
           maxArrayLength="200000000"
           maxStringContentLength="200000000"
           maxBytesPerRead="4096"
           maxNameTableCharCount="16384"/>
    </binding>
  </netTcpBinding>
</bindings>

重要:

如果您尝试传递具有许多连接对象的复杂对象(例如:树数据结构,具有许多对象的列表......),无论您如何增加配额,通信都将失败。 在这种情况下,您必须增加包含对象计数:

<behaviors>
  <serviceBehaviors>
    <behavior name="NewBehavior">
      ...
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

答案 12 :(得分:1)

在web.config上使用此设置时出现此错误

System.ServiceModel.ServiceActivationException

我设置如下设置:

      <service name="idst.Controllers.wcf.Service_Talks">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_TalksAspNetAjaxBehavior"
      binding="webHttpBinding" contract="idst.Controllers.wcf.Service_Talks" />
  </service>
  <service name="idst.Controllers.wcf.Service_Project">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_ProjectAspNetAjaxBehavior"
      binding="basicHttpBinding" bindingConfiguration="" bindingName="largBasicHttp"
      contract="idst.Controllers.wcf.Service_Project" />
  </service>
</services>

<bindings>
<basicHttpBinding>
    <binding name="largBasicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="32"
             maxArrayLength="200000000"
             maxStringContentLength="200000000"/>
    </binding>
</basicHttpBinding>