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

部署在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:55:28