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

如何配置IIS的WebSocket协议与SignalR以解决Blazor Server连接超时断开问题?

解决Blazor Server + SignalR在IIS 10上的连接断开问题

咱们一步步排查,先从最容易踩的坑开始解决:

1. 先修复SignalR包版本不匹配的核心问题

你的项目基于.NET Core 3.1,但引用的SignalR包版本完全混乱:Microsoft.AspNetCore.SignalR.Client用了5.0.16,Microsoft.AspNetCore.SignalR.Core用了1.1.0,版本不匹配会直接导致底层通信逻辑冲突,这大概率是IIS部署时连接断开的主要原因。

解决步骤:

  • 卸载当前这两个版本不一致的SignalR包
  • 安装和.NET Core 3.1完全匹配的稳定版包:
    <PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.1.32" />
    <PackageReference Include="Microsoft.AspNetCore.SignalR.Core" Version="3.1.32" />
    
    (选3.1系列的最新稳定版即可,和你的.NET Core SDK版本保持一致更稳妥)

2. 确认IIS WebSocket的完整配置

你已经在服务器角色里启用了WebSocket,但还要检查站点级和应用池的细节配置:

  • 打开IIS管理器,找到你的站点,切换到功能视图,双击「WebSocket协议」,确认勾选「启用WebSocket」
  • 检查应用池配置:
    • 必须把**.NET CLR版本设置为无托管代码**(.NET Core应用是自托管运行时,不需要IIS的托管CLR)
    • 除了禁用回收,还要把闲置超时设为较大值(比如0或3600分钟),避免IIS因为应用闲置主动断开连接

3. 正确配置SignalR传输逻辑

你提到设置了HttpTransportType,要确保配置是针对Blazor Server的核心SignalR连接(Blazor Server本身就是基于SignalR运行的),在Startup.cs里做以下配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    
    // 配置SignalR参数,明确启用WebSocket作为首选传输
    services.AddSignalR(options =>
    {
        options.ClientTimeoutInterval = TimeSpan.FromSeconds(30);
        options.KeepAliveInterval = TimeSpan.FromSeconds(10);
    }).AddWebSocketTransport(); // 确保添加WebSocket传输支持
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...其他中间件配置(比如静态文件、错误页等)...
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub(); // Blazor的核心SignalR Hub
        endpoints.MapFallbackToPage("/_Host");
        // 如果有自定义SignalR Hub,也要在这里映射
        // endpoints.MapHub<YourCustomHub>("/yourhubpath");
    });
}

如果是自定义Hub的客户端连接,也要明确指定优先用WebSocket:

var connection = new HubConnectionBuilder()
    .WithUrl(NavigationManager.ToAbsoluteUri("/yourhubpath"), options =>
    {
        options.Transports = HttpTransportType.WebSockets;
        options.CloseTimeout = TimeSpan.FromSeconds(30);
    })
    .Build();

4. 调整IIS请求超时设置

错误提示里的「server time elapsed」大概率和请求超时有关,需要调整IIS的连接参数:

  • 打开站点的高级设置,把「连接超时」设为更大的值(比如3600秒)
  • 打开站点的配置编辑器,定位到system.webServer/webSocket节点,设置pingInterval为30秒左右,确保心跳包能维持长连接

5. 启用日志排查细节

如果以上步骤都做了还是有问题,就开详细日志找具体原因:
在appsettings.json中添加日志配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore.SignalR": "Debug",
      "Microsoft.AspNetCore.Http.Connections": "Debug"
    }
  }
}

部署后查看日志文件,就能精准定位连接断开的触发点(比如握手失败、心跳超时等)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:57:39