.NET 6 SignalR在IIS Web Garden模式下报404连接关闭,Redis背板无效求助
问题分析与解决方案
你的问题核心是Web Garden模式下SignalR连接频繁返回404,即使配置了Redis背板仍未解决,主要原因可能是IIS会话亲和性未启用,同时代码层面也存在几个需要检查的点:
一、IIS配置必须修正的项
- 启用会话亲和性(Sticky Sessions):
在应用程序池的「高级设置」中,找到「启用会话亲和性」选项,设置为True。SignalR的长连接依赖客户端请求始终路由到同一个工作进程,若没有粘滞会话,后续请求被分配到其他进程时,该进程无对应连接上下文,直接返回404。这是Web Garden场景下SignalR正常运行的必要前提,Redis背板仅解决进程间消息同步,无法替代粘滞会话的作用。 - 确认ASP.NET Core模块配置:
应用程序池的「.NET CLR版本」需设置为无托管代码,因为.NET 6是跨平台框架,依赖ASP.NET Core模块托管,若使用.NET Framework的CLR版本会导致运行异常。 - 启用IIS WebSockets协议:
在服务器管理器的「Web服务器(IIS)」→「添加角色和功能」中,确保勾选「WebSockets协议」。SignalR默认优先使用WebSockets,缺失该功能会降级到其他传输方式,加剧多进程下的连接不稳定。
二、代码层面的检查与修正
- 确保Redis连接真实可用:
代码中使用Console.WriteLine输出Redis连接日志,在IIS环境下这些日志不会显示在控制台,需替换为依赖注入的ILogger记录日志,确认Redis确实连接成功。另外,若Redis实例设置了密码,需在ConfigurationOptions中添加config.Password = "你的Redis密码";,否则连接可能看似成功但无法正常通信,导致背板失效。 - 指定Redis背板的应用名称:
在AddStackExchangeRedis配置中添加o.ApplicationName = "/MyHub";(替换为你的Hub路由前缀),确保所有工作进程使用相同的Redis键前缀,避免进程间连接状态无法同步。示例修改:.AddStackExchangeRedis(o => { o.ApplicationName = "/MyHub"; // 添加此行 o.ConnectionFactory = async writer => { // 原连接代码不变 }; }); - 验证Hub路由配置:
确认在Program.cs中正确映射Hub路由,例如:
客户端连接地址必须与该路由完全一致,若路由不匹配会直接返回404。app.MapHub<MyHub>("/myhub"); - 检查Hub过滤器是否影响连接:
你的代码中添加了MyFilter,需确认该过滤器未在连接建立阶段抛出异常或非法终止连接,可临时移除过滤器测试是否解决问题。
总结
优先检查并启用IIS的会话亲和性,这是Web Garden模式下SignalR避免404的核心配置;再逐一排查Redis连接的有效性、代码中的路由与背板配置,即可解决问题。
内容的提问来源于stack exchange,提问作者john_9559
相关产品推荐
相关产品推荐

