IIS部署SignalR WebSocket报1006错误:本地正常IIS运行异常
解决IIS部署.NET Core 6 Web API + React项目WebSocket 1006错误的排查方案
检查.NET Core项目WebSocket中间件配置顺序
确保Program.cs中app.UseWebSockets()的位置正确,必须放在app.UseRouting()之后、app.UseEndpoints()之前,示例代码如下:var builder = WebApplication.CreateBuilder(args); // 注册服务... var app = builder.Build(); // 其他中间件(如静态文件、认证授权等) app.UseRouting(); app.UseWebSockets(); // 关键位置 app.UseEndpoints(endpoints => { endpoints.MapControllers(); // 映射自定义WebSocket端点 endpoints.Map("/ws", async context => { if (!context.WebSockets.IsWebSocketRequest) { context.Response.StatusCode = StatusCodes.Status400BadRequest; return; } // 处理WebSocket逻辑 }); }); app.Run();验证IIS应用程序池配置
- 将应用程序池的
.NET CLR版本设置为无托管代码,因为.NET Core是自托管模式,IIS仅作为反向代理,错误的CLR版本会导致WebSocket请求处理异常。 - 确认应用程序池身份拥有项目目录的读写权限,权限不足可能导致连接中途断开。
- 将应用程序池的
确保IIS反向代理传递WebSocket请求头
在站点的web.config中,添加URL重写规则时必须保留WebSocket相关请求头,示例配置:<rewrite> <rules> <rule name="Proxy to .NET Core" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:5000/{R:1}" /> <serverVariables> <set name="HTTP_UPGRADE" value="{HTTP_UPGRADE}" /> <set name="HTTP_CONNECTION" value="{HTTP_CONNECTION}" /> </serverVariables> </rule> </rules> </rewrite>若使用IIS ARR(应用程序请求路由),需在ARR的
Server Proxy Settings中勾选Enable WebSocket。修正前端WebSocket连接地址
前端React应用的WebSocket连接地址必须匹配IIS部署后的域名,HTTPS环境下需使用wss://协议,避免浏览器因混合内容拦截连接。例如:// 本地开发 // const socket = new WebSocket('ws://localhost:5000/ws'); // 部署后 const socket = new WebSocket('wss://your-domain.com/ws');排查日志与防火墙
- 启用IIS失败请求跟踪,捕获WebSocket请求的详细错误流程,定位是否存在请求拦截或状态码异常。
- 将.NET Core日志级别设为
Debug,查看连接建立过程中的异常信息,比如端点映射错误、权限问题等。 - 确认服务器防火墙开放了WebSocket使用的端口(默认80/443,自定义端口需手动开放),同时检查安全软件是否拦截了WebSocket连接。
内容的提问来源于stack exchange,提问作者Emrah Morgil
相关产品推荐
相关产品推荐

