.NET5迁移WCF客户端发送大请求报SocketException(10054)问题求助
问题根因
- 核心原因是.NET 5+ WCF底层依赖的HttpClient默认启用了
Expect: 100-continue请求头,面向.NET Framework搭建的老旧WCF服务端通常没有对该请求头做适配处理:当客户端发送大请求时,会先发送仅携带请求头的报文等待服务端返回100状态码再发送正文,服务端未识别该逻辑直接等待正文上传,超时后主动断开连接,对应首次请求20秒报错的规律;后续请求复用连接池里已经被服务端关闭的连接,因此1-2秒就会触发连接重置异常。.NET Framework 版本的WCF客户端默认禁用该请求头,因此运行正常。 - 你最初使用的
CustomBinding配置缺少消息编码绑定元素,仅配置了传输层,导致WCF消息格式不符合服务端要求,大请求解析失败也会触发服务端主动断连。
解决方案
- 全局禁用100-continue请求头
在WCF客户端注册逻辑执行前添加以下代码:
System.Net.ServicePointManager.Expect100Continue = false;
- 修正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
相关产品推荐
相关产品推荐

