You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:54:03