如何在Windows窗体应用中设置transferMode为Streamed并解决消息大小超限问题
解决WCF消息大小配额超出问题
核心问题
你当前的app.config里basicHttpBinding存在两个同名的binding节点(name="aName"),这会导致配置冲突——WCF会优先加载后面那个空的未配置参数的binding,你修改的第一个带security的binding根本没被用上,这就是为什么改了配置也没用。
修正步骤
- 删除basicHttpBinding下重复的空
<binding name="aName" />节点,避免配置覆盖 - 在保留的binding节点中添加
readerQuotas配置(仅设置maxReceivedMessageSize不够,消息内容的元素数量、字符串长度等超限也会触发错误) - 确保endpoint绑定的是正确的binding配置
修正后的完整配置
<system.serviceModel> <bindings> <basicHttpBinding> <!-- 只保留一个配置完整的binding节点 --> <binding name="aName" maxReceivedMessageSize="67108864" transferMode="Streamed"> <security mode="aWord" /> <!-- 添加readerQuotas放宽内容限制 --> <readerQuotas maxDepth="32" maxStringContentLength="67108864" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> </binding> </basicHttpBinding> <customBinding> <binding name="anotherName" > <textMessageEncoding messageVersion="Soap12" /> <httpsTransport transferMode="Streamed" maxReceivedMessageSize="67108864"/> </binding> </customBinding> </bindings> <client> <endpoint address="theAdress" binding="basicHttpBinding" bindingConfiguration="aName" contract="aNamePortType" name="EndpointName" /> <!-- other endpoints --> </client> </system.serviceModel>
额外注意事项
- 如果你的代码里是手动创建WCF客户端实例(而非直接用Visual Studio生成的客户端),请确保代码中配置的binding参数和app.config一致,或者直接在代码中设置所有参数,示例代码如下:
var binding = new BasicHttpBinding("aName"); // 确保代码中也配置了足够大的参数 binding.MaxReceivedMessageSize = 67108864; binding.ReaderQuotas.MaxStringContentLength = 67108864; binding.TransferMode = TransferMode.Streamed; var client = new YourServiceClient(binding, new EndpointAddress("theAdress"));
- 若仍有问题,检查服务返回的消息是否真的是通过你配置的这个endpoint传输的,确认没有其他同名endpoint或binding干扰。
内容的提问来源于stack exchange,提问作者leGato
相关产品推荐
相关产品推荐

