控制台托管的SignalR服务端未发送keep-alive导致连接频繁重连
可能的忽略点
- 检查
Hub的OnConnectedAsync方法是否在控制台运行时未正常完成:SignalR服务端的保活定时器需要等OnConnectedAsync执行完成后才会启动,如果该方法内存在开发环境下会阻塞的逻辑(比如调用了只有Service Fabric集群内才可达的服务、读取不存在的配置等),方法一直处于await挂起状态,就会导致保活逻辑始终不触发,连接到达超时时间后被断开。 - 核对不同环境下的配置加载优先级:控制台运行时默认会加载
launchSettings.json里的环境变量、appsettings.Development.json配置文件,你可能在上述位置无意中覆盖了SignalR的保活配置:- 检查是否
KeepAliveInterval被设为了TimeSpan.Zero,该值会直接禁用服务端应用层保活 - 检查是否通过环境变量
ASPNETCORE_SIGNALR__KEEPALIVEINTERVAL等隐式配置修改了默认值
- 检查是否
- 确认控制台托管的Host构建逻辑是否缺失必要的服务注册:如果你在控制台模式下用的是通用Host而非WebHost构建,要确认
AddSignalR()调用没有被if (Environment.IsProduction())这类环境判断包裹,漏注册SignalR的后台保活托管服务会直接导致保活不触发。 - 检查开发环境下的调试器影响:如果运行控制台程序时附加了调试器,ASP.NET Core默认会启用
DisableTimeoutForDebugging特性,部分版本的ASP.NET Core存在该特性意外禁用SignalR保活定时器的已知问题,你可以尝试不附加调试器直接运行控制台程序验证是否复现。 - 核对Kestrel的WebSocket配置差异:Service Fabric托管时可能使用了集群级别的默认WebSocket传输层保活配置,而控制台托管的Kestrel默认关闭了WebSocket传输层保活,你可以显式配置Kestrel的WebSocket选项开启传输层保活作为补充:
builder.Services.Configure<WebSocketOptions>(opts => { opts.KeepAliveInterval = TimeSpan.FromSeconds(15); });
内容的提问来源于stack exchange,提问作者Kent Boogaart
相关产品推荐
相关产品推荐

