WCF返回JSON字符串数组超出MaxBufferSize,绑定配置无效如何解决
问题根因
你之前配置不生效有两个核心原因:
- 仅定义了绑定配置,未将该配置关联到对应WCF服务的端点,配置没有实际生效
- 缺少
readerQuotas节点的相关参数配置,字符串数组的序列化大小限制不止由maxBufferSize控制,还受该节点下的字符串长度、数组长度阈值限制
调整步骤
1. 完善服务端配置
在服务端的配置文件中,除了定义绑定参数,还要将绑定配置关联到服务端点,同时补充readerQuotas配置:
<bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IService" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" > <!-- 补充序列化阈值配置 --> <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> </binding> </basicHttpBinding> </bindings> <services> <!-- 将绑定配置关联到你的服务端点,注意name和contract要和你实际的服务名、接口名对应 --> <service name="你的服务命名空间.Service1"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService" contract="你的服务命名空间.IService1" /> </service> </services>
这里的2147483647是int类型最大值,你可以根据实际返回的数组大小调整,不需要直接拉满。
2. 同步更新客户端配置
WCF的大小限制是客户端和服务端两端都生效的,你需要同步修改客户端的app.config/web.config配置,保证绑定参数和服务端完全一致,同时也要将绑定配置关联到客户端的端点:
<client> <endpoint address="http://你的服务地址/Service1.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService" contract="Web2String.IService" name="BasicHttpBinding_IService" /> </client>
3. 验证配置生效
配置修改完成后重启服务端和客户端,直接返回数组即可正常传输。如果你后续需要针对不同接口设置不同的阈值,可以单独定义多套绑定配置,分别关联到不同的端点即可。
内容的提问来源于stack exchange,提问作者NoMoreMemes
相关产品推荐
相关产品推荐

