解决WCF传输的数据量过大问题

 

今天写了个WCF接口,然后自测通过,和别人联调时报 远程服务器返回错误: (413) Request Entity Too Large        错误!记得以前写的时候也出现过这个错误,大致解决办法是设置服务器端的接收最大消息的限制改大点。但具体的配置节点及参数有点忘记了,网上搜了些资料改正并经过自测验证后通过,主要的配置如下:

  服务端返回数据量过大的错误时,就去修改服务端的配置:

    在bindings节点添加一个binding配置,主要是指定最大的接收数据,主要是maxReceivedMessageSize属性的值:

 

<binding name="LargeDataTransferServicesBinding" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" transferMode="Streamed" sendTimeout="00:10:00" />

 

然后给相应的Service指定bindingConfiguration属性,指向之前的这个binding配置,注意,因为是服务端的配置,所以是在services节点中加配置,contract这个节点是你的服务契约名:

<services>
      <service name="Huazhu.Certificate.WCFService.SyncDataService">
               <endpoint address="" binding="basicHttpBinding" bindingConfiguration="LargeDataTransferServicesBinding" name="XXX" contract="Huazhu.Certificate.WCFService.ISyncDataService" />
      </service>
    </services>


配置好后去测试,然后报了另外一个错误,大致如下:

格式化程序尝试对消息反序列化时引发异常: 对操作“PushMasterData”的请求消息正文进行反序列化时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。 行 1,位置 2177

好,现在应该是数据能接收到了,看字面上意思应该是要设置个MaxStringContentLength什么属性的值,貌似默认的读取长度不够,然后在经过修改binding节点的配置如下:

<binding name="LargeDataTransferServicesBinding" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" transferMode="Streamed" sendTimeout="00:10:00" >
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
        </binding>


经过测试调用成功,但想想如果提供的WCF接口非常多,每个Service都得配置,这样就太多的重复了。有没有更简单的呢?直接上如下代码说明,只需要配置一个没有name属性的binding节点就可以,连前面的Service都可以不用配置了,我的理解是没有配置name属性,就相当于是默认的binding,除非单独制定了配置,不然都会走这个默认的绑定。

<binding   closeTimeout="00:10:00" receiveTimeout="00:20:00" sendTimeout="00:20:00"
          maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"/>


这个配置同样适用于WCF的客户端配置,也是只需要一个binding即可搞定,本文中的节点的其他一些属性若有不理解,请自行去网上搜,资料很多。

 

posted @ 2017-08-30 15:22 潇洒一回 阅读(...) 评论(...) 编辑 收藏