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

.NET Core 3.1部署后SignalR Hub调用方法时WebSocket连接异常关闭

问题解决方案

核心原因排查方向

1. 反向代理配置问题(90%以上该场景问题的诱因)

你提到部署到服务器才出现问题,本地正常,大概率是前置反向代理(IIS/Nginx/Apache等)的SignalR/WebSocket专属配置缺失:

  • 如果是Nginx部署,在站点配置中添加以下规则:
location /Hub/Test {
    proxy_pass http://你的后端服务实际地址;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    # 关闭代理缓冲,避免实时消息被缓存触发断连
    proxy_buffering off;
    # 调整超时时间,避免无交互时主动断连
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
}
  • 如果是IIS部署:
    • 确认已经安装服务器角色中的「WebSocket协议」组件
    • 在站点web.config的<system.webServer>节点下添加配置:
    <webSocket enabled="true" receiveBufferLimit="0" />
    <aspNetCore ...> <!-- 保留你原有的aspNetCore配置 -->
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
    </aspNetCore>
    

2. 服务端SignalR配置优化

在Program.cs/Startup.cs的SignalR服务注册逻辑中开启详细错误,方便定位根因:

services.AddSignalR(options =>
{
    // 开启详细错误,客户端可拿到服务端异常信息
    options.EnableDetailedErrors = true;
    // 调整保活间隔和超时阈值
    options.KeepAliveInterval = TimeSpan.FromSeconds(15);
    options.ClientTimeoutInterval = TimeSpan.FromSeconds(30);
});

同时修改appsettings.json的日志配置,输出SignalR详细运行日志,复现问题后可直接查看服务端日志确认断连原因:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore.SignalR": "Debug",
      "Microsoft.AspNetCore.Http.Connections": "Debug"
    }
  }
}

3. 客户端代码异步处理修正

你现有的客户端代码没有处理异步方法的Promise,会导致未捕获的异常抛出,建议调整为:

// 改为异步方法处理连接
async function start() {
    try {
        await connection.start();
        console.log("SignalR Connected.");
    } catch (err) {
        console.log(err);
        setTimeout(start, 5000);
    }
};

async function test() {
    try {
        // invoke是异步方法,需要await等待执行完成
        await connection.invoke("Test", "Foo");
    } catch (err) {
        alert(err);
    }
}

其他次要排查点

  • 确认服务器安全组、WAF、防火墙等没有限制WebSocket帧的大小、传输频率
  • 确认服务端SignalR版本和客户端JS版本完全匹配,避免版本兼容问题
  • 如果你用了负载均衡部署,需要开启粘性会话(Session Affinity)保证同一个客户端的请求一直落到同一个后端节点

内容的提问来源于stack exchange,提问作者Tuan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:21:02