You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 16:39:01