当通过 Azure API 管理连接时,WebSocket 服务总是在收到来自客户端的消息后关闭连接

WebSocket service always closes the connection after receiving a message from the client when connecting through Azure API Management

我在 Azure Kubernetes 上部署了 WebSocket 服务。如果直接连接到服务,它工作正常,但是当我尝试通过 API 管理连接我的服务时。它总是在收到来自客户端的消息后关闭连接。

服务代码

 from fastapi import FastAPI, Request, Header, Response
 from fastapi import WebSocket, WebSocketDisconnect, Query
 from fastapi.middleware.cors import CORSMiddleware
    
 from pathlib import Path
    
 import os
 import time
 import websockets
 import logging
    
 from custom_logging import CustomizeLogger
    
 app = FastAPI()
 app.add_middleware(
     CORSMiddleware,
     allow_origins=["*"],
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],
 )
    
 # logger = logging.getLogger(__name__)
 config_path=Path(__file__).with_name("log_config.json")
 logger = CustomizeLogger.make_logger(config_path)
    
 @app.websocket("/ws")
 async def websoc(websocket: WebSocket):
     await websocket.accept()
     try:
         while True:
             msg = await websocket.receive_text()
             logger.info('recieve:'+ msg)
    
             await websocket.send_text(msg)
            
     except Exception as e:
         logger.info(e)

客户代码

 import websockets
 import asyncio
 import time
    
 async def send_receive():
     async with websockets.connect(
         'wss://xxxx.azure-api.net/testwebsocket?subscription-key=xxx', 
                                   ping_interval=5,
                                   ping_timeout=20) as websocket:
         for i in range(10):
             await websocket.send(str(i))
             await asyncio.sleep(0.1)
             msg = await websocket.recv()
             print(msg)
            
 asyncio.run(send_receive())

通过 API 管理调用时我的自定义登录服务的结果

直接调用我的自定义登录服务的结果


来自后端的网络跟踪。

红色是API管理。 蓝色是后端。

来自我本地计算机的网络跟踪。

红色是API管理。 绿色是本地机器。


来自 APIM 的日志

APIM 不支持自定义 Sec-WebSocket-Extensions。您的客户端 websocket 库可能会发送一些。您可以在 api 策略中添加一个设置 Sec-WebSocket-Extensions header 为空并确认。参考 https://docs.microsoft.com/en-us/azure/api-management/api-management-transformation-policies#SetHTTPheader