WCF – 如何增加邮件大小配额
我有一个WCF服务,从数据库返回1000个logging到客户端。 我有一个ASP.NET的WCF客户端(我已经在asp.net的Web应用程序项目中添加服务引用,以消耗WCF)。
我运行客户端应用程序时收到以下消息:
传入消息的最大消息大小限额(65536)已被超出。 要增加配额,请在适当的绑定元素上使用MaxReceivedMessageSize属性。
任何帮助? 如何增加邮件大小限额?
你会想要这样的东西来增加消息大小配额,在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>
并在您的端点configuration中使用绑定名称
... bindingConfiguration="basicHttp" ...
值的理由很简单,它们足够大以容纳大多数消息。 您可以调整该号码以适应您的需求。 低的默认值基本上是为了防止DOStypes的攻击。 如果达到20000000,分布式DOS攻击就可以生效,64k的默认大小需要大量的客户端才能胜过大多数服务器。
如果您在使用WCFtesting客户端时仍然收到此错误消息,这是因为客户端具有单独的MaxBufferSize设置。
要纠正这个问题:
- 右键单击树底部的“ configuration文件”节点
- select使用SvcConfigEditor编辑
将出现可编辑设置列表,包括MaxBufferSize。
注意: 默认情况下,自动生成的代理客户端也将MaxBufferSize设置为65536。
如果您正在dynamic创buildWCF绑定,请使用以下代码:
BasicHttpBinding httpBinding = new BasicHttpBinding(); httpBinding.MaxReceivedMessageSize = 2147483647; httpBinding.MaxBufferSize = 2147483647; // Commented next statement since it is not required // httpBinding.MaxBufferPoolSize = 2147483647;
WCFtesting客户端有它自己的客户端configuration。
运行testing客户端并滚动到底部。 如果您双击configuration文件节点,您将看到XML表示。 正如你所看到的maxReceivedMessageSize
是65536
。
要编辑它,请右键单击“configuration文件”树节点,然后select“使用SvcConfigEditor
编辑”。 当编辑器打开展开绑定并双击自动生成的绑定。
你可以在这里编辑所有的属性,包括maxReceivedMessageSize
。 完成后,单击文件 – 保存 。
最后,当你回到WCF Test Client窗口时,点击Tools – Options 。
注 : 启动服务时取消选中总是重新生成configuration 。
我find了简单的方法
—右键单击webconfig或应用程序configuration文件,然后单击编辑WCFconfiguration,并得到bingdigs和select优先服务和右侧显示maxReciveMessageSize给了一个大数—
我解决了这个问题…如下
<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>
<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>
我在我的项目上使用CalculateRoute()解决了Bing Maps WPF上的问题。 解决scheme在我的情况是设置maxReceivedMessageSize和maxReceivedMessageSize属性“httpTransport”为“customBinding”部分。
我在applications.config文件(如myApp.config)中设置了这个configuration:
<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>
不要忘记,执行入口点的app.config将被考虑,而不是pipe理Web服务调用的类库项目(如果有的话)。
例如,如果在运行unit testing时出现错误,则需要在testing项目中设置适当的configuration。
另一个重要的事情要考虑我的经验..
我强烈build议不要最大化maxBufferPoolSize,因为池中的缓冲区永远不会释放,直到应用程序域(即应用程序池)回收。
一个高stream量的时期可能会导致大量的内存使用,从不释放。
更多细节在这里:
在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>
对于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>