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

当我运行客户端应用程序时,我得到以下消息:

传入消息的最大消息大小配额(65536)已为 超过了。如果需要增加配额,使用 MaxReceivedMessageSize属性 适当的绑定元素。

任何帮助吗?如何增加消息大小配额?


当前回答

从我的经验来看,另一件需要考虑的重要事情是…

我强烈建议不要最大化maxBufferPoolSize,因为在应用程序域(即应用程序池)回收之前,池中的缓冲区永远不会释放。

一段时间的高流量可能会导致大量内存被使用,并且永远不会释放。

详情如下:

https://stackoverflow.com/a/19953113/496676 http://andriybuday.com/2011/08/wcf-configuration-caused-memory-leaks.html

其他回答

在App.config或Web中,您可能需要这样的方法来增加消息大小配额。配置文件:

<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将需要非常多的客户端来压倒当前的大多数服务器。

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

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

当我在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>

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

要纠正这个问题:

右键单击树底部的Config File节点 选择用SvcConfigEditor编辑

将出现一个可编辑的设置列表,包括MaxBufferSize。

注意:自动生成的代理客户端也默认设置MaxBufferSize为65536。

对我来说,我所要做的就是在客户端app.config中添加maxReceivedMessageSize="2147483647"。服务器没有受到影响。