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

Azure API Management中WebSocket带ID的URL映射容器端点400错误求助

问题描述
  • APIM前端WebSocket端点:wss://rosieapiservice.azure-api.net/ws/CA1234237643(/ws/后为每个调用的唯一标识符)
  • 后端容器服务端点:ws://rosie-demo.eastus.azurecontainer.io/ws/CA1234237643(使用非安全WebSocket协议)
  • 仅访问不带ID的路径wss://rosieapiservice.azure-api.net/ws/可成功连接,附加ID后返回400 Bad Request
  • 尝试过的无效策略:
<inbound>
    <base />
    <set-backend-service base-url="wss://rosieapiservice.azure-api.net/ws/@(context.Request.Url.Path.Substring(context.Api.Path.Length + 4))" />
</inbound>
解决建议

1. 修正API路径匹配规则

确保APIM中定义的API路径为通配符匹配:

  • 在APIM的API设计界面,将API路径设置为/ws/*,而非固定的/ws/。这样APIM才能正确捕获/ws/之后的完整路径(包括唯一ID)。

2. 调整set-backend-service策略

使用正确的表达式提取路径后缀,并指向后端的非安全WebSocket地址:

<inbound>
    <base />
    <!-- 提取/ws/之后的路径部分,拼接到后端地址 -->
    <set-backend-service base-url="ws://rosie-demo.eastus.azurecontainer.io/ws/@(context.Request.Url.Path.Substring(context.Api.Path.TrimEnd('/').Length))" />
</inbound>

表达式说明:

  • context.Api.Path.TrimEnd('/') 获取API定义的基础路径(如/ws),去除末尾斜杠避免长度计算偏差
  • context.Request.Url.Path.Substring(...) 提取基础路径之后的所有内容(即唯一ID),直接拼接到后端的/ws/路径后

3. 检查基础配置

  • 确认APIM的API已启用WebSocket协议:在API设置页,将协议设置为WebSocket。
  • 验证后端容器服务的网络规则:确保容器服务的NSG或防火墙放行APIM的出站IP范围,避免连接被拦截。

4. 排查请求细节

在APIM中开启请求跟踪或查看诊断日志,确认:

  • 转发到后端的URL是否正确拼接了唯一ID
  • WebSocket握手阶段的关键请求头(如Upgrade、Connection)是否被正确传递到后端

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:58:30