Azure Windows VM部署.NET5服务时SignalR公网无法使用WebSocket故障
根因定位
该问题由Http.Sys的默认配置与Azure公网链路的HTTP流量策略冲突导致,和手动配置的端口出入站规则无关:
- Azure公网接入层对HTTP/HTTPS流量默认配置了240秒的TCP空闲超时,同VPC内网流量不受该策略限制,这也是内网访问正常、公网异常的核心原因。Http.Sys默认的WebSocket保活间隔为2分钟,且默认开启大帧发送缓冲,公网传输时未及时发送的缓冲帧会被链路判定为空闲连接强制断开,对应日志中的
TaskCanceledException和Socket 10054错误。 - 测试的原生TCP客户端服务端走四层传输,不会被公网接入层的HTTP策略匹配,因此可以正常通信。
解决方案
方案一:继续使用Http.Sys承载
按以下两步调整配置即可修复:
- 调整Http.Sys的WebSocket相关参数,在启动配置中添加以下设置:
webBuilder.UseHttpSys(options => { // 调低WebSocket缓冲区,避免大帧堆积超时 options.MaxWebSocketBufferSize = 4096; // 设置保活间隔为30秒,远低于Azure公网240秒的空闲超时阈值 options.WebSocketKeepAliveInterval = TimeSpan.FromSeconds(30); // 保留原有基础认证配置即可 options.Authentication.Schemes = AuthenticationSchemes.Basic; });
- 禁用Azure VM网卡的TCP大发送卸载功能:打开设备管理器 -> 网络适配器 -> 选中当前使用的Azure虚拟网卡 -> 属性 -> 高级选项卡,将
Large Send Offload V2 (IPv4)、Large Send Offload V2 (IPv6)两项均设置为禁用,重启虚拟机后生效。
方案二:使用Kestrel承载(已验证可行)
Kestrel本身原生支持基础认证能力,无需依赖Http.Sys,只需安装Microsoft.AspNetCore.Authentication.Basic Nuget包,在服务启动时配置基础认证中间件即可兼容原有客户端的认证逻辑,无需额外调整业务代码。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

