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

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承载

按以下两步调整配置即可修复:

  1. 调整Http.Sys的WebSocket相关参数,在启动配置中添加以下设置:
webBuilder.UseHttpSys(options =>
{
    // 调低WebSocket缓冲区,避免大帧堆积超时
    options.MaxWebSocketBufferSize = 4096;
    // 设置保活间隔为30秒,远低于Azure公网240秒的空闲超时阈值
    options.WebSocketKeepAliveInterval = TimeSpan.FromSeconds(30);
    // 保留原有基础认证配置即可
    options.Authentication.Schemes = AuthenticationSchemes.Basic;
});
  1. 禁用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:15:08