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

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


已超过传入消息的最大消息大小配额(65536)
。要增加配额,请在相应的绑定元素上使用MaxReceivedMessageSize属性。


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

评论

我遇到了同样的问题,但是我遇到了一个不友好的网络错误400,但是解决方案是消息大小的东西。.

我通过使用[链接] [1] [1]中提到的步骤解决了这个问题:stackoverflow.com/questions/7476853/…

为什么默认将其设置为如此低?安全吗?

@Coops确实是安全的。通过在邮件上设置配额,例如,DDOS攻击(至少有点)难以执行。

#1 楼

您需要在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>


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

评论


谢谢..此更改需要在客户端应用程序的web.config文件中进行。

–bugBurger
09年5月19日在18:08

您可能还需要在服务器上进行更改-如果需要将大型数据集作为参数发送给WCF方法,则可能需要更改它。

–内特
09年5月19日在19:08

它足够大以容纳大多数消息。您可以调整该数字以满足您的需求。基本上可以防止DOS类型的攻击。如果将其设置为20000000,则可以使分布式DOS攻击有效,默认大小为64k,这将需要大量的客户端来使今天的大多数服务器过载。

–内特
2010年6月1日22:49

对于其他感兴趣的人,我在另一个博客上读到,最大大小为2147483647。20000000比该数字小一点,因此使用最小的数字可以避免不中断服务的发生。

– proudgeekdad
2010年10月7日在16:22

@Slauma如果传入参数太大,则需要在服务器上进行更改;否则(并且更有可能)需要在客户端配置文件中进行更改,这是因为服务的响应(而不是其参数)太大。

–内特
13年6月6日在2:44

#2 楼

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

要解决此问题:


右键单击树底部的“配置文件”节点
选择“使用SvcConfigEditor编辑”

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

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

评论


为什么哦,为什么我总是忘记这一点? +1

–詹姆斯·斯肯普(James Skemp)
2012年8月20日14:02

在vs2013上,如果人们正在寻找,则SvcConfigEditor将替换为Edit WCF配置。

–ZoomVirus
2014年9月24日上午11:27

找不到SVCconfigEditor?

– Arul Sidthan
2014-12-17 14:11

您将在Bindings文件夹下找到它,单击服务绑定,它就在其中。

– Sameer Alibhai
2015年2月6日在22:00

如果您的配置文件是自动生成的,则绝对应采用这种方式。每当您更新参考时,它将重新生成app.config,并且您将不得不再次手动更改它。如果您更改了VS,则新更改将适应您选择的设置。

–kingfrito_5005
15年7月23日在20:40

#3 楼

如果要动态创建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;


评论


您可以使用它进行初始化。显然,您可以将其用作构造函数方法。

– aemre
17年12月29日在13:28

#4 楼

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

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

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

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

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

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

评论


可能是这里最好的答案!

–哈里斯
2014年1月24日在8:28

请注意,请取消选中“始终重新生成配置”选项。

– Furier
2014-2-17在11:33

我认为最简单的解决方法。救了我一些头疼。

– Jared海滩
2014年8月26日15:55

在vs2013上,如果人们正在寻找,则SvcConfigEditor将替换为Edit WCF配置。

–ZoomVirus
2014年9月24日上午11:28

谢谢。当问题出在测试客户端配置上时,我已经花了一段时间了,一次又一次地更改服务器配置!

–法哈德
15年3月15日在9:05

#5 楼

我找到了简单的方法


---右键单击Webconfig或应用程序配置文件,然后单击EDIT WCF CONFIGURATION,然后转到dig select yore service,然后在右侧显示maxReciveMessageSize大量提供---


评论


这是一个很好的答案,我不知道可以从这里进行编辑,谢谢

–albert sh
17年5月30日在19:20

#6 楼

我解决了问题...如下

    <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>


评论


这与我的解决方案有何不同?除了您包括配置的所有不相关部分以及相关部分之外,您选择了最大可能值而不是我选择的200m?

–内特
2011年4月6日15:48



上下文也很好...也许这两个答案可以合并?

–杰夫
2011年6月30日19:08

该设置是在服务器还是客户端中配置?

–约翰·肯尼迪
2011-12-13 6:23

#7 楼

我使用CalculateRoute()解决了项目中Bing Maps WPF的问题。
我的解决方案是在属性“ httpTransport”的“ customBinding”部分设置maxReceivedMessageSize和maxReceivedMessageSize。我在apps.config文件(例如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>


#8 楼




<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>




评论


非常适合发布您的答案。重要的是,“ bindingConfiguration”值必须与绑定名称匹配。在您的示例“ wsHttpBinding_Username”中。

–布鲁诺·比耶里(Bruno Bieri)
2015年12月9日在9:06

#9 楼

根据我的经验,需要考虑的另一项重要事情。

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

一段时间的高流量可能会导致大量内存被使用而从未释放过。 //stackoverflow.com/a/19953113/496676
http://andriybuday.com/2011/08/wcf-configuration-caused-memory-leaks.html


#10 楼

对于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>


评论


maxItemsInObjectGraph对我来说是(快速)解决方案。但是,当增加此数量时,您应该考虑更好的解决方案是否是应用程序以块为单位请求数据,而不是可能会占用大量资源的庞大对象图。

– Paul
3月14日15:54

#11 楼

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

#12 楼

不要忘记,将考虑执行入口点的app.config,而不是如果有的话,将不考虑管理Web服务调用的类库项目中的一个。在运行单元测试时,需要在测试项目中设置适当的配置。

#13 楼

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

System.ServiceModel.ServiceActivationException


我设置如下设置: />

评论


因此,您使用Nate的答案解决了问题,然后将其发布为自己的问题。不酷

– arcain
13年3月29日在1:24

@arcain Nates的回答非常通用,使用的股票名称和编号可能会经常出现。这个答案没有被偷,只是正确的答案。由于只有一个正确的答案,因此必定会被重复。

–kingfrito_5005
15年7月23日在20:52

@ kingfrito_5005当回答者发布此答案时,“正确”答案已在此处。他很明显地取消了Nate的绑定元素,并将其重新发布作为他回答的一部分。这2000000个值非常不同。

– arcain
15年7月24日在15:05



@arcain,我不同意这些是非常标准的值,我的公司也在我们的绑定元素中使用它们。

–kingfrito_5005
15年7月24日在16:43