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

.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路由,例如:
    app.MapHub<MyHub>("/myhub");
    
    客户端连接地址必须与该路由完全一致,若路由不匹配会直接返回404。
  • 检查Hub过滤器是否影响连接:
    你的代码中添加了MyFilter,需确认该过滤器未在连接建立阶段抛出异常或非法终止连接,可临时移除过滤器测试是否解决问题。

总结

优先检查并启用IIS的会话亲和性,这是Web Garden模式下SignalR避免404的核心配置;再逐一排查Redis连接的有效性、代码中的路由与背板配置,即可解决问题。

内容的提问来源于stack exchange,提问作者john_9559

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:45:28