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

ASP.NET Core SignalR部署IIS后连接成功但握手取消错误如何解决?

故障原因及修复方案

  • 硬编码的连接地址不匹配部署环境:你当前客户端代码里的Hub连接地址固定写为http://localhost:53832/api/NotificationHub,部署到IIS后服务端不再运行在本地53832端口,需要修改为IIS站点对应的实际访问地址,若站点配置了HTTPS,还需要将地址前缀改为https,避免跨协议访问被拦截。推荐直接使用当前页面域名动态拼接地址,示例如下:
// 动态获取当前站点域名拼接Hub地址
const hubUrl = `${window.location.origin}/api/NotificationHub?userName=rtg0000003@maq.qa`
  • 跨域配置未适配部署场景:本地运行时没有跨域限制,部署后如果客户端和服务端部署在不同域名、端口下,需要在服务端Startup/Program文件中配置CORS规则,允许客户端所在域访问,同时必须开启AllowCredentials配置,SignalR跨域访问需要携带凭据。
  • 跳过协商配置导致路由匹配失败:你当前开启了skipNegotiation: true配置,该配置要求WebSockets请求必须直接命中Hub端点,若IIS站点配置了URL重写、虚拟目录、请求过滤规则拦截了握手请求,就会直接导致握手失败。可以先将该参数改为false,走标准协商流程定位传输问题。
  • 身份验证配置缺失:你代码中注释了JWT请求头配置,如果服务端部署后开启了身份验证,客户端未传递正确的身份凭据的话,服务端会直接中断握手流程,返回握手取消错误。
  • IIS站点权限检查:确认IIS站点的功能委派中WebSocket相关权限未被限制,同时检查站点web.config中没有禁用WebSocket的配置项。

修改后的客户端代码参考:

"use strict";
// 替换硬编码地址为动态拼接的实际部署地址
const hubUrl = `${window.location.origin}/api/NotificationHub?userName=rtg0000003@maq.qa`
var connection = new signalR.HubConnectionBuilder().withUrl(hubUrl, {
    // 先关闭跳过协商,排查问题后再根据需要开启
    skipNegotiation: false,
    configureLogging: "warn",
    withHandshakeResponseTimeout: 3000000,
    transport: signalR.HttpTransportType.WebSockets 
    // 若服务端开启JWT验证,放开注释填入正确的token
    //,headers :  {jwtBearer: tokenValue}
}).configureLogging(signalR.LogLevel.Debug)
    .build();
connection.serverTimeoutInMilliseconds = 1000000;
connection.on("NotifyClient", (response) => {
    var heading = document.createElement("h3");
    heading.textContent = response.useR_NAME;
    var p = document.createElement("p");
    p.innerText = response.subject;
    var div = document.createElement("div");
    div.appendChild(heading);
    div.appendChild(p); document.getElementById("articleList").appendChild(div);
});
connection.start().catch(function (err) {
    return console.error(err.toString());
}).then(function () {
    document.getElementById("user").innerHTML = "UserId: " + userId;
    connection.invoke("GetConnectionId").then(function (connectionId) {
        document.getElementById("signalRConnectionId").innerHTML = connectionId;
    })
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:36:03