.NET 8 环境下 SignalR 连接失败问题求助
.NET 7迁移到.NET 8后SignalR部署到IIS 10无法连接问题
本地Visual Studio 2022(Win11)环境运行正常,但部署到Windows Server 2019的IIS 10上时,SignalR在hub.start()阶段报错,无法建立连接。
客户端代码
<script> var hub = new signalR.HubConnectionBuilder() .withUrl("/hub") .withAutomaticReconnect() .configureLogging(signalR.LogLevel.Debug) .build(); var initMessaging = async function() { try { console.log("Before hub.start()") await hub.start() .then(() => { console.log("Hub connection established"); }) .catch((err) => { console.error("[1]:", err); }); console.log("After hub.start()") } catch (err) { console.error("[2]:", err); } } $(function() { initWhenReadyMessaging(); }); </script>
服务端Program.cs相关代码
... services.AddSignalR(); ... var desiredTransports = HttpTransportType.WebSockets | HttpTransportType.LongPolling; app.MapHub<SignalRHub>("/hub", (options) => { options.Transports = desiredTransports; });
环境信息
- 服务器:Windows Server 2019 Standard、IIS 10.0.17763.1、.NET 8.0.0 Windows Server Hosting bundle
- 依赖包:@microsoft/signalr@8.0.0、jQuery 3.7.1
排查与解决方案建议
启用IIS WebSocket协议
打开服务器管理器→添加角色和功能→Web服务器(IIS)→应用程序开发,确保WebSocket协议已勾选安装。.NET 8对WebSocket依赖更严格,未启用会直接导致连接失败。修复.NET 8 Hosting Bundle
重新运行.NET 8.0.0 Windows Server Hosting bundle安装包,选择修复模式。确认IIS模块中存在AspNetCoreModuleV2。调整应用程序池设置
- 将应用程序池的.NET CLR版本设置为无托管代码(ASP.NET Core应用无需托管代码)
- 确认应用程序池身份拥有网站目录的读写权限
简化SignalR传输配置
暂时移除传输方式限制,让SignalR自动选择合适传输:app.MapHub<SignalRHub>("/hub");若WebSocket仍有问题,可单独启用LongPolling测试:
options.Transports = HttpTransportType.LongPolling;检查客户端代码笔误
客户端中定义的函数是initMessaging,但初始化时调用的是initWhenReadyMessaging,修正为:$(function() { initMessaging(); });同时建议统一使用async/await语法,避免then/catch混合,便于错误追踪:
var initMessaging = async function() { try { console.log("Before hub.start()") await hub.start(); console.log("Hub connection established"); console.log("After hub.start()") } catch (err) { console.error("Connection failed:", err); } }查看服务器日志
在Program.cs添加事件日志记录:builder.Logging.AddEventLog();打开Windows事件查看器→应用程序日志,获取服务器端的详细错误信息。
内容的提问来源于stack exchange,提问作者Ingmar
相关产品推荐
相关产品推荐

