我有一个WCF服务,它从数据库向客户端返回1000条记录。我有一个ASP.NET WCF客户端(我在asp.net Web应用程序项目中添加了服务引用以使用WCF)。
运行客户端应用程序时收到以下消息:
传入邮件的最大邮件大小限额(65536) 超标。要增加配额,请使用 MaxReceivedMessageSize属性 适当的绑定元素。
有任何帮助吗?如何增加邮件大小配额?
答案 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 设置。
要解决此问题:
将显示可编辑设置列表,包括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表示。正如您所见,maxReceivedMessageSize
是65536
。
要编辑此项,请右键单击“配置文件”树节点,然后选择“使用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>