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

SignalR自动重连异常:2分钟后才触发Closed事件求助

SignalR Closed事件延迟2分钟触发的原因及解决办法

核心原因:IIS默认连接超时设置

你的问题大概率和IIS的站点连接超时有关。IIS默认的连接超时时间为120秒(2分钟),当SignalR长连接持续超过这个阈值,IIS会主动断开连接,此时客户端才会感知到连接丢失,进而执行重连逻辑,最终在重连全部失败后触发Closed事件。

排查与解决方向

1. 调整IIS连接超时配置

  • 打开IIS管理器,定位到目标站点
  • 点击右侧「高级设置」
  • 在「连接」分组下,将「连接超时」修改为你预期的阈值(比如30秒)

2. 同步SignalR前后端超时参数

即使使用默认配置,也建议显式设置后端的超时参数,确保与客户端逻辑匹配:

// 后端Startup/Program.cs中配置
builder.Services.AddSignalR(options =>
{
    // 客户端超时时间,需小于IIS连接超时
    options.ClientTimeoutInterval = TimeSpan.FromSeconds(30);
    // 心跳间隔,建议为超时时间的一半
    options.KeepAliveInterval = TimeSpan.FromSeconds(15);
});

客户端可补充配置CloseTimeout,同时优先启用WebSocket(减少长连接感知延迟):

_hubConnection = new HubConnectionBuilder()
    .WithUrl(_url, options =>
    {
        options.Headers.Add("User", JsonConvert.SerializeObject(user));
        options.Transports = HttpTransportType.WebSockets;
        options.CloseTimeout = TimeSpan.FromSeconds(30);
    })
    .ConfigureLogging((builder) => builder.SetMinimumLevel(LogLevel.Debug))
    .WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(5) })
    .Build();

3. 启用IIS WebSocket协议

WebSocket的连接机制比长轮询更高效,能更及时地感知连接丢失。需在IIS中启用WebSocket功能:

  • 打开「服务器管理器」→「添加角色和功能」
  • 在「Web服务器(IIS)」→「Web服务器」→「应用程序开发」中勾选「WebSocket协议」

验证方式

修改配置后,手动断开网络或停止后端服务,观察Reconnecting事件是否立即触发,以及Closed事件是否在3次重连失败后快速触发,而非等待2分钟。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:30:27