Docker+Nginx环境下ASP.NET SignalR连接报错求助
修复SignalR反向代理报错的Nginx配置调整
针对你遇到的Cannot change transports mid-connection错误,需要对Nginx的/some-hub/ location块做以下补充和调整:
- 添加
proxy_request_buffering off;:关闭请求缓冲,确保WebSocket握手和实时数据能直接传递,避免缓冲中断SignalR的传输切换流程。 - 统一路径匹配规则:将
location /some-hub/和proxy_pass http://AppManager:8080/some-hub/的结尾斜杠去掉,改为location /some-hub和proxy_pass http://AppManager:8080/some-hub,避免请求路径被错误重写(比如出现//negotiate这类无效路径)。 - 补充
X-Forwarded-Host头:添加proxy_set_header X-Forwarded-Host $host;,确保ASP.NET应用能获取正确的主机信息,生成正确的SignalR连接地址。
调整后的完整/some-hub location块如下:
location /some-hub { proxy_pass http://AppManager:8080/some-hub; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_read_timeout 86400s; proxy_send_timeout 86400s; proxy_buffering off; proxy_request_buffering off; proxy_cache_bypass $http_upgrade; }
同时,必须确保你的ASP.NET应用配置了转发头支持,在Program.cs中添加以下代码(放在app.UseRouting()之前):
builder.Services.AddForwardedHeaders(options => { options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto; // Docker环境中可设置为允许所有代理,或指定Nginx容器的IP options.KnownProxies.Add(IPAddress.Parse("0.0.0.0/0")); }); app.UseForwardedHeaders();
错误原因解析
- 最初的
No Connection with that ID:是因为Nginx开启了响应缓冲,导致SignalR的连接ID无法及时传递到客户端,关闭proxy_buffering后解决了该问题,但未关闭请求缓冲引发了新错误。 Cannot change transports mid-connection:请求缓冲会中断SignalR在长轮询与WebSocket之间的传输切换流程,同时路径斜杠不统一或转发头缺失会导致ASP.NET生成错误的连接地址,最终触发该报错。
内容的提问来源于stack exchange,提问作者user19291301
相关产品推荐
相关产品推荐

