如何配置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完全匹配的稳定版包:
(选3.1系列的最新稳定版即可,和你的.NET Core SDK版本保持一致更稳妥)<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.1.32" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.Core" Version="3.1.32" />
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
相关产品推荐
相关产品推荐

