.NET Core 6 SignalR部署至IIS后无法正常工作求助
本地Visual Studio 2022运行.NET Core 6项目时SignalR功能正常,但发布到IIS服务器后,SignalR连接失败,报错404。
相关代码:
- JavaScript连接代码:
const connection = new signalR.HubConnectionBuilder().withUrl("/checkproduct").build();
- Program.cs配置:
app.MapHub<ProductHub>("/checkproduct");
报错信息:
Failed to load resource: the server responded with a status of 404 (Not Found) signalr.js:3082
[2024-01-22T06:11:53.892Z] Error: Failed to complete negotiation with the server: Error: Not Found
[2024-01-22T06:11:53.893Z] Error: Failed to start the connection: Error: Not Found
检查IIS应用程序池设置
把应用程序池的.NET CLR版本改成无托管代码——.NET Core应用是自托管的,不需要IIS的托管CLR,设置错了会导致请求路由异常。确认站点URL路径匹配
如果IIS站点部署在子应用下(比如http://服务器地址/MyApp),前端SignalR连接URL必须带上子应用路径:const connection = new signalR.HubConnectionBuilder().withUrl("/MyApp/checkproduct").build();或者用相对路径自动适配,避免硬编码:
const connection = new signalR.HubConnectionBuilder().withUrl(`${window.location.pathname}checkproduct`).build();安装ASP.NET Core模块
.NET Core应用部署到IIS必须装ASP.NET Core托管捆绑包(ASP.NET Core Hosting Bundle),它负责把请求转发给.NET Core的Kestrel服务器。没装的话,SignalR的WebSocket或长轮询请求没法被正确处理,直接报404。验证发布文件完整性
检查服务器上的发布目录:- 确认
wwwroot下的signalr.js/signalr.min.js存在且路径正确; - 确认
ProductHub所在的程序集已经正确部署,没有缺失依赖文件。
- 确认
启用IIS WebSocket功能
SignalR依赖WebSocket协议,得确保IIS开启了WebSocket:- 打开IIS管理器,找到目标站点,在功能视图里打开
WebSocket; - 如果没启用,去服务器管理器的
角色和功能里添加WebSocket协议。
- 打开IIS管理器,找到目标站点,在功能视图里打开
查看应用日志找细节
在服务器上开启.NET Core应用的日志,看具体错误原因。可以修改appsettings.json的日志配置:"Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore.SignalR": "Debug", "Microsoft.AspNetCore.Http.Connections": "Debug" } }日志一般在
%ProgramFiles%\IIS\Asp.Net Core Module\V2目录,或者应用自己的日志目录里。
内容的提问来源于stack exchange,提问作者dudi

