部署在IIS WebGarden的SignalR连接偶发失败问题排查求助
问题分析与配置修正
核心原因
你遇到的偶发连接失败,本质是WebGarden多工作进程环境下缺少粘性会话配置,加上前端启用了skipNegotiation: true导致的:
- 页面刷新时,客户端会复用之前的ConnectionID直接发起WebSocket连接,但IIS WebGarden会把请求随机分配到3个工作进程中的某一个。
- 如果新请求路由到的进程不是之前建立连接的进程,该进程没有这个ConnectionID的连接上下文,就会抛出「连接ID在服务器不存在」的错误。
- Redis背板的作用是跨进程同步SignalR的消息推送,但它不会共享单个连接的会话上下文,每个工作进程只会维护自己处理的连接。
配置遗漏点及修正方案
1. 为IIS WebGarden启用粘性会话
在IIS中配置进程亲和性,确保同一个客户端的请求始终路由到同一个工作进程:
- 打开IIS管理器,找到目标站点 → 进入「应用程序池」→ 选中对应应用池 → 右键点击「高级设置」
- 在「进程模型」区域,确认「最大工作进程数」为3,然后将「启用进程亲和性」设置为
True
2. 调整前端skipNegotiation配置
skipNegotiation: true会跳过SignalR的协商步骤,直接复用旧ConnectionID连接,这种模式仅适用于单进程部署或已配置粘性会话的多进程场景。如果未配置粘性会话,必须关闭该配置:
// 修正后的前端连接配置 skipNegotiation: false, // 恢复协商步骤,获取当前进程的有效连接信息 transport: WebSockets
若坚持使用skipNegotiation: true,则必须确保IIS粘性会话配置正确,否则必然出现跨进程连接失败问题。
3. 优化Redis连接日志(可选)
当前日志仅输出连接状态,建议补充详细错误信息,便于排查潜在的Redis瞬间断连问题:
connection.ConnectionFailed += (_, e) => { Log.Information("Connection to Redis failed: {Message}", e.Message); }; connection.InternalError += (_, e) => { Log.Information("Redis internal error: {Message}", e.Exception.Message); };
总结
你的配置遗漏了IIS WebGarden的进程亲和性(粘性会话),加上前端skipNegotiation: true的使用放大了问题。优先启用粘性会话,再根据场景调整前端配置,即可解决偶发连接失败的问题。
内容的提问来源于stack exchange,提问作者crocodayl
相关产品推荐
相关产品推荐

