ASP.NET Core 5 Razor Pages如何向SignalR Core Hub传递Session Id
问题原因
你自定义的DefaultHttpClient仅负责处理SignalR的HTTP类请求(如negotiate协商、长轮询请求),WebSocket协议的连接建立流程不经过该HttpClient,因此你添加的查询参数/请求头不会出现在WebSocket请求中。
解决方法
1. 修改前端JS代码
无需自定义HttpClient,直接将sessionId作为查询参数拼接在withUrl的Hub地址后,SignalR会自动将该参数继承到所有后续连接请求(包括WebSocket请求)中:
@page @model IndexModel <script type="text/javascript"> var sessionId = "@Model.SessionId"; var connection = new signalR.HubConnectionBuilder() .withUrl(`/sessionsHub?sessionId=${encodeURIComponent(sessionId)}`) .build(); connection.start().then(() => { }).catch(function (err) { return console.error(err.toString()); }); </script>
2. 优化Hub端获取逻辑
简化sessionId的查询逻辑,无需遍历整个Query集合:
public class SessionHub : Hub { public override async Task OnConnectedAsync() { await base.OnConnectedAsync(); string sessionId = GetSessionId(); // 此处添加你的业务逻辑 } private string GetSessionId() { HttpContext httpContext = Context.GetHttpContext(); if (httpContext.Request.Query.TryGetValue("sessionId", out var sessionId)) { return sessionId.ToString(); } throw new NullReferenceException("未获取到有效sessionId"); } }
注意事项
- 确保你已经在启动配置中正确启用Session服务,
UseSession的调用顺序需放在UseRouting之后、UseAuthorization和端点映射之前 - Session默认是惰性初始化的,若你未给Session写入过任何值,每次请求的Session Id都会动态变化,可在Razor Page的
OnGet方法中添加一行_httpContext.Session.SetString("_init", "1")触发Session初始化,保证Session Id稳定
内容的提问来源于stack exchange,提问作者Appsum Solutions
相关产品推荐
相关产品推荐

