当通过 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
我在 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