由于连接:Keep-Alive,升级,Azure APIM 为 WebSocket API 抛出错误

Azure APIM throws error for WebSocket API due to Connection: Keep-Alive,Upgrade

我在 Azure API 管理服务门户上有 REST 和 WebSocket APIs。对于不同的开发环境,WebSocket 正在根据来自 clients/frontend 的输入参数重定向到不同的 Web Pubsub 服务。

当从 Google Chrome 访问 WebSocket api 时,我能够成功建立连接 end-to-end。 从 Firefox 访问相同的 WebSocket api 时,我从 APIM 服务收到 InvalidWebsocketUpgrade 错误。

发生这种情况是因为 Chrome 在套接字连接请求 header 中发送 Connection: Upgrade,而 Firefox 在 header 中发送 Connection: Keep-Alive, Upgrade

Chrome 请求:

GET wss://apim-test.azure-api.net/qa/socket?access_token=eyJhbGc HTTP/1.1
Host: apim-ecv.azure-api.net
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
Upgrade: websocket
Origin: https://abc.xyz.com
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Sec-WebSocket-Key: GTWCGvTFJN82sAl8gVv+VA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Protocol: json.webpubsub.azure.v1

Firefox 请求:

GET wss://apim-test.azure-api.net/qa/socket?access_token=eyJhbGciOi HTTP/1.1
Host: apim-ecv.azure-api.net
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Sec-WebSocket-Version: 13
Origin: https://az-qa2.ecarevault.com
Sec-WebSocket-Protocol: json.webpubsub.azure.v1
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: r764n2hSpKKr0Y63z1Ok3A==
Connection: keep-alive, Upgrade
Sec-Fetch-Dest: websocket
Sec-Fetch-Mode: websocket
Sec-Fetch-Site: cross-site
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

我需要配置任何东西来支持 APIM 或其他任何地方吗??

  • 很高兴您在 Microsoft Q&A 中找到了解决方案。在这里张贴建议以帮助其他社区成员,因为这是一个功能请求,将有助于相关讨论的成员。

  • 根据连接 header 中的这个 document,您只需要使用 Upgrade 因为它是一个 WebSocket 协议并且截至目前 APIM 已启用仅将 Upgrade 作为连接 header 的值,并且 MS 正在努力启用 keep-alive, Upgrade 值,这可能是一个功能请求。