You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET5迁移WCF客户端发送大请求报SocketException(10054)问题求助

问题根因
  • 核心原因是.NET 5+ WCF底层依赖的HttpClient默认启用了Expect: 100-continue请求头,面向.NET Framework搭建的老旧WCF服务端通常没有对该请求头做适配处理:当客户端发送大请求时,会先发送仅携带请求头的报文等待服务端返回100状态码再发送正文,服务端未识别该逻辑直接等待正文上传,超时后主动断开连接,对应首次请求20秒报错的规律;后续请求复用连接池里已经被服务端关闭的连接,因此1-2秒就会触发连接重置异常。.NET Framework 版本的WCF客户端默认禁用该请求头,因此运行正常。
  • 你最初使用的CustomBinding配置缺少消息编码绑定元素,仅配置了传输层,导致WCF消息格式不符合服务端要求,大请求解析失败也会触发服务端主动断连。
解决方案
  1. 全局禁用100-continue请求头
    在WCF客户端注册逻辑执行前添加以下代码:
System.Net.ServicePointManager.Expect100Continue = false;
  1. 修正CustomBinding配置(如果使用自定义绑定)
    添加TextMessageEncodingBindingElement,注意绑定元素的顺序必须是编码层在前,传输层在后:
var customBinding = new CustomBinding();
// 必须添加消息编码层,匹配WSHttpBinding默认的SOAP12+WS寻址规范
customBinding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressing10, Encoding.UTF8));
var httpsBindingElement = new HttpsTransportBindingElement
{
    AllowCookies = false, // 匹配服务端配置
    MaxBufferSize = int.MaxValue,
    MaxReceivedMessageSize = int.MaxValue,
    RequireClientCertificate = true,
    UseDefaultWebProxy = true // 匹配.NET Framework客户端配置
};
customBinding.Elements.Add(httpsBindingElement);

如果使用你提供的WSHttpBinding替代配置,无需额外调整绑定结构,仅添加第一步的禁用配置即可。
3. 升级WCF客户端NuGet包
将项目中所有System.ServiceModel.*开头的NuGet包升级到最新稳定版,修复早期版本存在的大消息传输兼容bug。
4. 可选:调整TLS版本兼容(如果服务端使用低版本TLS)
如果服务端仅支持TLS1.0/1.1,可在客户端添加配置:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
验证说明

完成上述配置后重新测试,首次大请求不会再有20秒等待,大小请求均可正常返回。


内容的提问来源于stack exchange,提问作者Michael280

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:45:02