YARP对接.NET Core 5/6 SignalR时如何配置转发/chat路径WebSocket流量
YARP 转发 SignalR WebSocket 配置方案
基础配置(appsettings.json)
直接在YARP网关项目的配置文件中添加如下ReverseProxy节点即可:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ReverseProxy": { "Routes": { "chat-websocket-route": { "ClusterId": "signalr-api-cluster", "Match": { "Path": "/chat/{**catch-all}" }, "Metadata": { "WebSocketProtocol": "true" } } }, "Clusters": { "signalr-api-cluster": { "Destinations": { "signalr-api-instance": { "Address": "http://替换为你的API服务实际地址:端口/" } } } } }, "AllowedHosts": "*" }
配置说明:
- 路由规则匹配所有
/chat/开头的请求,覆盖SignalR协商、WebSocket升级、心跳包等全链路请求 WebSocketProtocol设为true后YARP会自动处理WebSocket协议升级逻辑,不需要手动改写请求头
网关项目代码配置(Program.cs)
必须按顺序注册WebSocket中间件和YARP服务,否则无法正常识别WebSocket请求:
var builder = WebApplication.CreateBuilder(args); // 注册YARP反向代理服务 builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var app = builder.Build(); // 先启用WebSocket中间件,再启用YARP转发 app.UseWebSockets(); app.MapReverseProxy(); app.Run();
SignalR服务端配套配置
确保你的API服务中ChatHub的映射路径和转发规则匹配,示例如下:
// 部署SignalR的API服务Program.cs代码 var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR(); var app = builder.Build(); // 映射路径对应YARP转发的/chat前缀 app.MapHub<ChatHub>("/chat/hub"); app.Run();
前端连接时使用ws://<domain>/chat/hub即可被正常转发到后端SignalR服务。
多实例部署补充配置
如果你的SignalR服务部署了多个实例,需要在集群配置中开启会话粘滞,避免长连接断开:
"signalr-api-cluster": { "SessionAffinity": { "Enabled": "true", "Policy": "Cookie", "FailurePolicy": "Redistribute" }, "Destinations": { "signalr-api-instance": { "Address": "http://替换为你的API服务实际地址:端口/" } } }
内容的提问来源于stack exchange,提问作者Dhiru
相关产品推荐
相关产品推荐

