[.net] WCF - 如何增加邮件大小配额


Answers

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

纠正这个问题:

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

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

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

Question

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

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

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

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




另一个重要的事情要考虑我的经验..

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

高流量时段可能会导致大量内存被使用,从未释放。

更多细节在这里:




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



我解决了这个问题......如下

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



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

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

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

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

最后,当你回到WCF测试客户端窗口时,点击工具 - 选项

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




我在我的项目上使用CalculateRoute()解决了Bing Maps WPF上的问题。 在我的情况下,解决方案是在“customBinding”部分的属性“httpTransport”上设置maxReceivedMessageSize和maxReceivedMessageSize。

我在applications.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>





Related