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

SignalR Service经Azure Function连接:CORS部分机器正常部分失败求助

Azure Function + Serverless SignalR 连接异常:部分机器未发起第二个OPTIONS请求

我的Web应用通过Azure Function连接Serverless SignalR Service时,大部分机器均可正常连接,但在某台工作机器上,仅发送了针对function-url.com/negotiate?negotiateVersion=1的初始OPTIONS请求,却未紧接着发送第二个针对signalr-service-url.com/client/negotiate?hub=roomfunctions&negotiateVersion=1的OPTIONS请求。尽管SignalR服务默认允许所有域,但缺少该请求会导致连接失败——所有正常工作的机器都会发送第二个OPTIONS请求。

客户端连接逻辑简单明确,且在几乎所有机器上都能正常运行;另有一个架构和配置几乎相同的SignalR应用,在这台故障机器上却能正常工作。

故障机器请求截图:
故障机器请求

正常机器请求截图:
正常机器请求

客户端连接代码:

let conn = new signalR.HubConnectionBuilder()
  .withAutomaticReconnect()
  .withUrl(url, {
    headers: {
      'x-ms-signalr-user-id': user.id,
    },
  })
  .build()

conn.onclose(() => {
  console.log('signalr connection closed')
})

conn.onreconnecting(() => {
  console.log('signalr reconnecting')
})

conn.onreconnected(() => {
  console.log('signalr reconnected')
})

await conn.start()

排查方向建议

  • 浏览器扩展/缓存干扰:清除浏览器缓存,禁用所有扩展后重试。广告拦截、隐私保护类扩展可能拦截跨域请求,尤其是SignalR服务相关的请求。
  • 企业网络规则限制:工作机器处于内网时,代理或防火墙可能拦截了第二个OPTIONS请求。对比正常机器的网络配置,联系IT确认是否存在针对signalr-service-url.com的拦截规则。
  • 浏览器版本兼容性:检查故障机器的浏览器版本,尝试升级到最新稳定版。不同版本的浏览器对SignalR客户端的支持可能存在差异。
  • CORS响应缓存问题:在浏览器开发者工具中勾选「Disable cache」后重新测试,避免旧的CORS响应缓存导致请求被拦截。
  • SignalR客户端版本差异:确认故障机器加载的@microsoft/signalr版本与正常机器一致,不同版本的协商流程可能存在差异。
  • 初始请求响应分析:查看第一个OPTIONS请求的响应头,重点检查Access-Control-Allow-Origin、Access-Control-Allow-Methods等CORS字段是否存在异常,这可能导致客户端终止后续请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:57:20