运行客户端应用程序时收到以下消息:
已超过传入消息的最大消息大小配额(65536)
。要增加配额,请在相应的绑定元素上使用MaxReceivedMessageSize属性。
有帮助吗?如何增加邮件大小配额?
#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表示形式。如您所见,
maxReceivedMessageSize
是65536
。 要编辑此文件,请右键单击“配置文件”树节点,然后选择“使用
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
评论
我遇到了同样的问题,但是我遇到了一个不友好的网络错误400,但是解决方案是消息大小的东西。.我通过使用[链接] [1] [1]中提到的步骤解决了这个问题:stackoverflow.com/questions/7476853/…
为什么默认将其设置为如此低?安全吗?
@Coops确实是安全的。通过在邮件上设置配额,例如,DDOS攻击(至少有点)难以执行。