Angular与ASP.NET Core SignalR频繁断连报1006状态码错误求助
问题修复方案
1. 优先排查IIS 10配置(部署在IIS环境下是1006错误的最常见诱因)
- 确认IIS已开启WebSocket功能:打开「服务器管理器」→「添加角色和功能」→「服务器角色」→「Web服务器(IIS)」→「应用程序开发」→勾选「WebSocket协议」,安装完成后重启IIS
- 调整应用池闲置超时:打开站点对应应用池的高级设置,将默认20分钟的「闲置超时(分钟)」调整为0,或大于你预期的最长连接保持时长
- 关闭IIS WebSocket主动心跳切断:站点功能视图打开「配置编辑器」,节点选择
system.webServer/websockets,将pingEnabled设为False,或调大pingInterval参数,避免IIS主动断开空闲的WebSocket连接
2. 补充SignalR服务端缺失的超时、保活配置
当前Startup.cs未配置SignalR的连接生命周期参数,默认值极易触发自动断开,修改AddSignalR配置如下:
services.AddSignalR(hubOptions => { hubOptions.EnableDetailedErrors = true; // 客户端2分钟无消息则判定为断开 hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(2); // 服务端每30秒发送一次保活包,维持连接 hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(30); });
如果存在跨域场景,需要补充对应的CORS配置,允许对应域名的Credentials请求。
3. 修复客户端代码缺陷
当前客户端代码存在两处会直接触发断开的问题:
start()是异步方法,未做异常捕获和重试,连接初始化失败时会直接终止连接- 监听
TriggerMessage的回调中直接引用了未定义的machine变量,运行时抛出的未捕获异常会导致上下文崩溃,直接断开连接
修改后的客户端代码如下:
async createSignalrConnection(){ const comp = this; this.signalR = new signalR.HubConnectionBuilder() .withUrl(environment.signalrEndpoint + "/triggers") // 自定义重连间隔,避免默认4次重连后完全停止重连 .withAutomaticReconnect([0, 2000, 5000, 10000, 30000]) .build(); // 先注册监听事件再启动连接 this.signalR.onreconnecting(error=>{ console.log(error.toString(), " reconnect.."); }); this.signalR.onreconnected(connectionId => { console.log("重连成功,新连接ID:", connectionId); }); // 自动重连完全失败后手动触发重新初始化 this.signalR.onclose(async () => { console.log("连接已关闭,尝试重新启动"); await this.startConnection(); }); this.signalR.on('TriggerMessage', (message: string)=>{ try{ // 补充message反序列化逻辑,修复未定义machine变量的问题 const machine = JSON.parse(message); comp.eventManager.emit("triggerEvent", machine); } catch(err) { console.log(err.toString()); } }); await this.startConnection(); } // 封装启动逻辑,加失败重试机制 private async startConnection() { try { await this.signalR.start(); console.log("SignalR连接建立成功"); } catch (err) { console.log("连接启动失败,5秒后重试:", err.toString()); setTimeout(() => this.startConnection(), 5000); } }
4. 其他排查方向
- 检查客户端和服务端之间的反向代理、WAF、防火墙等中间设备,这类设备通常会主动切断长时间空闲的TCP连接,需要将SignalR的保活间隔设置为小于设备的连接超时阈值,或调整设备的超时配置
- 开启服务端SignalR详细日志,在appsettings.json中添加如下配置,日志会输出断开的具体根因,比客户端的1006错误更精准:
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.SignalR": "Debug", "Microsoft.AspNetCore.Http.Connections": "Debug" } } }
内容的提问来源于stack exchange,提问作者Ori
相关产品推荐
相关产品推荐

