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

Azure APIM与SignalR集成问题:同路径异协议路由异常

解决Azure SignalR与APIM集成的路由问题

问题根源

你创建的两个独立API中,WebSocket API的路径模板(/client)会前缀匹配所有以/client开头的请求,包括/client/negotiate,导致APIM优先将请求路由到WebSocket API,而非HTTP的negotiate接口。

正确实现方案:单API多操作模式

将HTTP和WebSocket请求的路由逻辑整合到同一个API下,通过操作级别的路径模板+协议约束来区分请求:

  1. 创建统一API

    • 设置API的URL后缀为/client,所有请求的基础路径为 <APIM url>/client
    • 后端服务指向你的Azure SignalR服务地址(示例:https://<your-signalr>.service.signalr.net/client)
  2. 添加HTTP Negotiate操作

    • 请求方法选择:POST
    • URL模板填写:/negotiate
    • 后端路径保持默认(自动拼接为/client/negotiate指向SignalR服务)
    • 可选入站策略校验(确保仅HTTPS请求进入):
      <choose>
        <when condition="@(context.Request.Protocol != "HTTPS")">
          <return-response>
            <set-status code="400" reason="Bad Request" />
            <set-body>{"error": "Only HTTPS requests allowed for negotiate"}</set-body>
          </return-response>
        </when>
      </choose>
      
  3. 添加WebSocket连接操作

    • 协议选择:WebSocket
    • URL模板填写:/(对应基础路径后的根路径,即<APIM url>/client)
    • 后端路径保持默认(指向SignalR的WebSocket端点wss://<your-signalr>.service.signalr.net/client)
    • 可选入站策略校验(确保仅WebSocket请求进入):
      <choose>
        <when condition="@(context.Request.Protocol != "WebSocket")">
          <return-response>
            <set-status code="400" reason="Bad Request" />
            <set-body>{"error": "Only WebSocket requests allowed for this endpoint"}</set-body>
          </return-response>
        </when>
      </choose>
      

验证路由

  • 发送POST <APIM url>/client/negotiate:会被路由到HTTP操作,正确触发SignalR协商
  • 建立WebSocket连接到wss://<APIM url>/client:会被路由到WebSocket操作,正确连接SignalR服务

额外注意事项

  • 确认APIM实例已启用WebSocket支持:在“设置”->“协议”中勾选WebSocket选项
  • 检查SignalR服务的CORS设置,允许APIM域名访问
  • 若仍有路由冲突,可在API的“高级”设置中调整路由匹配优先级,确保精确路径(如/negotiate)优先于宽泛路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:42:36