【问题标题】:Set cookie from SignalR hub on the server从服务器上的 SignalR 集线器设置 cookie
【发布时间】:2021-12-18 00:26:55
【问题描述】:

无论如何我可以从 SignalR 集线器内部设置一个 cookie,特别是 OnConnected 方法。我想发送一个带有会话 id 的 cookie。

我试过了,但它似乎不起作用,它也看起来很尴尬,因为我不确定为什么我需要提供一个字符串和一个 cookie 的键值对。

public override Task OnConnected()
{
    var guid = new Guid();
    Context.RequestCookies.Add("SessionID", new Microsoft.AspNet.SignalR.Cookie("SessionID", guid.ToString()));
    return null;
}

【问题讨论】:

    标签: c# asp.net signalr


    【解决方案1】:

    这是一个老问题,但如果有人偶然发现它,有一种方法可以从 Signalr 2.0+ 中的集线器添加 cookie。 HttpContextBase 可以通过中心请求上下文访问,因此您可以执行以下操作:

    var newCookie = new HttpCookie("cookieName", "cookieValue");
    Context.Request.GetHttpContext().Response.Cookies.Add(newCookie);
    

    【讨论】:

    • 它不工作,并说“响应在这种情况下不可用。”
    【解决方案2】:

    我最终决定从服务 MVC 控制器中设置 cookie,但无论如何我都找不到在 SignalR 调用中设置它。

    【讨论】:

      【解决方案3】:

      我选择子类化并使用 PersistentConnection 而不是 Hub,以便在服务器上有更多选项。

      在我的情况下,我覆盖 OnConnectedAsync 并使用其中的 connectionId 来跟踪连接/会话。也许您可以考虑这种方法?

      protected override Task OnConnectedAsync(IRequest request, string connectionId)
          {
      

      【讨论】:

      • 我无法真正从 PersistentConnections 切换到集线器,这是一种彻底的改变
      【解决方案4】:

      Signal-R 是一个沟通渠道。它将尝试假设可能的最佳速度/技术,但会很好地降级,直到它以长轮询 http 请求结束。

      当前最佳的网络连接是使用 Websockets 建立的,但你不能依赖那 100%

      请注意,每个已建立的 Signal-R 连接还会生成一个唯一的 URL 作为连接请求的参数。这个参数就是“connection Id”,刷新浏览器会生成一个新的。

      因此,如果您使用 cookie 作为“会话标识符”,以便即使用户决定刷新浏览器也可以保持会话,请注意 cookie 值也会在该设备上打开的所有浏览器选项卡之间共享.

      您不能从 Hub 的响应中写入 Cookie,但您可以使用例如写入 Cookie。 Razor/MVC 控制器或纯 javascript...在您打开 Signal-R 连接之前 - 然后您可以从 Context.GetHttpContext().Request.Cookies 集合中读取该 Cookie 值。

      但只读!

      关键是,在普通 Razor 页面或您拥有的任何方式上创建“登录系统”,然后编写您需要的 cookie - 然后打开 Signal-R 连接并利用该会话用于您可能有的任何目的。

      【讨论】:

        【解决方案5】:

        我刚刚尝试了同样的事情,这似乎有效:

        HttpContext.Current.Response.Cookies.Add(cookie);
        

        【讨论】:

        • 讨论的是 SignalR,而不是 MVC。
        • 很久以前,但很确定我是在 SignalR 上下文中完成的。
        • 用更正来更新你的答案,我会取消。
        • 这只是为我抛出Response is not available in this context
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 2023-03-29
        相关资源
        最近更新 更多