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

部署后无法连接Azure SignalR服务的排查求助

Azure SignalR 连接问题排查思路

问题背景

已部署Azure SignalR服务、Azure Functions及带HTTPTrigger的Negotiate方法,前后端部署完成后前端无法连接SignalR服务,但本地代理时可正常连接。CORS已设为*仍无效,推测是Azure Front Door的公网访问策略拦截请求,且无明确CORS错误。

UI报错截图

UI报错截图

相关代码与配置

UI连接代码

const connection = new signalR.HubConnectionBuilder()
      .withUrl(url, {
          withCredentials: false,
      })
      .withAutomaticReconnect()
      .configureLogging(signalR.LogLevel.Information)
      .build();

后端Negotiate函数代码

[FunctionName(nameof(Negotiate))]
public SignalRConnectionInfo Negotiate(
    [HttpTrigger(AuthorizationLevel.Function)] HttpRequest req,
    [SignalRConnectionInfo(HubName = "notificationsSignalR", ConnectionStringSetting = "AzureSignalRConnectionString")] SignalRConnectionInfo connectionInfo)
{
        return connectionInfo;
}

Azure SignalR部署脚本(Bicep)

param namespace_name string 
param location string = resourceGroup().location

resource signalR 'Microsoft.SignalRService/signalR@2023-02-01' = {
  name: namespace_name
  location: location
  sku: {
    capacity: 2
    name: 'Standard_S1'
    tier: 'Standard'
  }
  kind: 'SignalR'
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    tls: {
      clientCertEnabled: false
    }
    features: [
      {
        flag: 'ServiceMode'
        value: 'Serverless'
        properties: {}
      }
      {
        flag: 'EnableConnectivityLogs'
        value: string(true)
      }
    ]
    cors: {
      allowedOrigins: [
        '*'
      ]
    }
    serverless: {
      connectionTimeoutInSeconds: 30
    }
    networkACLs: {
      defaultAction: 'Deny'
      publicNetwork: {
        allow: [
          'ClientConnection'
        ]
      }
      privateEndpoints: [
        {
          name: 'mySignalRService.1fa229cd-bf3f-47f0-8c49-afb36723997e'
          allow: [
            'ServerConnection'
          ]
        }
      ]
    }
    upstream: {
      templates: []
    }
  }
}

排查与解决步骤

1. 检查Azure Front Door路由规则

  • WebSocket支持:确认路由规则中已启用WebSocket协议(Front Door默认支持,但需确保未在规则中禁用)。SignalR优先使用WebSocket传输,若Front Door不支持会直接导致连接失败。
  • HTTP方法与头允许:确保路由规则允许GET、POST、OPTIONS方法,同时允许Upgrade请求头(用于WebSocket握手流程)。
  • 缓存规则:禁止缓存Negotiate接口的响应,该接口返回临时连接信息,缓存会导致前端获取失效的连接地址。
  • 路径匹配:确认路由规则未拦截Negotiate接口路径及SignalR Hub的路径(通常为/hub/{hubName})。

2. 验证Azure SignalR网络ACL配置

从部署脚本看,SignalR的networkACLs默认动作为Deny,仅公网允许ClientConnection,需注意:

  • 若前端通过Front Door直接连接SignalR,需将Front Door的IP地址段添加到SignalR的公网允许列表,避免Front Door的请求被拦截。
  • 若Negotiate接口通过Azure Functions代理,需确保Functions所在网络(如私有端点)能正常访问SignalR的ServerConnection(脚本中已配置私有端点允许ServerConnection,需确认Functions与该私有端点连通性)。

3. 检查Azure Functions访问限制

  • IP允许列表:若Functions设置了IP限制,需将Front Door的IP地址段加入允许列表,避免Front Door的请求被Functions拦截。
  • CORS配置:虽然SignalR已设*,需确认Functions的CORS配置也已设置为*或对应前端域名,确保Negotiate接口的跨域请求正常流转。

4. 日志分析定位问题

  • Azure Front Door日志:启用Front Door的访问日志,查看请求的状态码、错误信息,确认是否存在拦截或路由失败情况。
  • Azure SignalR连接日志:利用已启用的EnableConnectivityLogs,检查是否有来自Front Door的连接请求被拒绝,或连接建立失败的具体原因。
  • Azure Functions日志:查看Negotiate函数的执行日志,确认请求是否到达函数、返回的连接信息是否正确(如SignalR服务地址、access token是否有效)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:45:58