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

如何延长SignalR超时时间?.NET9 WebAPI与Blazor调试问题

解决.NET9 SignalR 15秒超时及Dispatcher异常问题

一、补全SignalR超时配置项

你当前的配置存在遗漏,导致15秒超时仍会触发,需补充以下设置:

  1. Blazor客户端添加KeepAliveInterval配置
    客户端需主动发送心跳包维持连接,仅设置ServerTimeout不足以避免超时,需添加:
hubConnection.KeepAliveInterval = TimeSpan.FromMinutes(9); // 建议比服务器端的KeepAliveInterval短1分钟,确保客户端先发起心跳
  1. API端配置Kestrel服务器超时
    Kestrel默认连接超时会覆盖SignalR的配置,需显式调整:
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(10);
    options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(10);
});
  1. 检查反向代理超时(若有)
    如果API部署在IIS、Nginx等反向代理后,需同步调整代理的超时设置:
  • IIS:修改站点配置的connectionTimeout为10分钟
  • Nginx:将proxy_read_timeout调整至600秒

二、修复Dispatcher异常

该异常源于SignalR回调运行在后台线程,直接更新Blazor组件状态会触发线程错误,必须用InvokeAsync切换到UI线程:

示例:处理SignalR消息或连接关闭事件时

// 接收Hub消息时
hubConnection.On<string>("YourHubMethod", async (data) =>
{
    await InvokeAsync(() =>
    {
        // 在这里编写更新组件状态的代码,例如:
        // ComponentState = data;
        // StateHasChanged();
    });
});

// 连接关闭回调(超时后会触发)
hubConnection.Closed += async (error) =>
{
    await InvokeAsync(() =>
    {
        // 更新UI提示连接断开
        // IsConnected = false;
    });
    // 可选:自动重连逻辑
    await Task.Delay(TimeSpan.FromSeconds(5));
    await hubConnection.StartAsync();
};

三、验证配置生效

开启SignalR调试日志排查问题:

  • API端在appsettings.json中添加:
"Logging": {
  "LogLevel": {
    "Microsoft.AspNetCore.SignalR": "Debug",
    "Microsoft.AspNetCore.Http.Connections": "Debug"
  }
}
  • Blazor客户端添加日志级别配置:
hubConnection.LogLevel = Microsoft.AspNetCore.SignalR.Client.LogLevel.Debug;

通过日志可查看心跳包发送情况、超时触发的具体节点,确认配置是否生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:02:44