WCF – 如何增加邮件大小配额

我有一个WCF服务,从数据库返回1000个logging到客户端。 我有一个ASP.NET的WCF客户端(我已经在asp.net的Web应用程序项目中添加服务引用,以消耗WCF)。

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

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

任何帮助? 如何增加邮件大小限额?

你会想要这样的东西来增加消息大小配额,在App.configWeb.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设置。

要纠正这个问题:

  1. 右键单击树底部的“ configuration文件”节点
  2. 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表示。 正如你所看到的maxReceivedMessageSize65536

要编辑它,请右键单击“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>