解决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即可搞定,本文中的节点的其他一些属性若有不理解,请自行去网上搜,资料很多。