9

无论如何我可以从 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;
}
4

5 回答 5

4

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

var newCookie = new HttpCookie("cookieName", "cookieValue");
Context.Request.GetHttpContext().Response.Cookies.Add(newCookie);
于 2017-06-14T19:35:29.627 回答
3

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

于 2013-03-19T17:37:27.040 回答
0

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

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

protected override Task OnConnectedAsync(IRequest request, string connectionId)
    {
于 2013-02-27T13:54:20.323 回答
0

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

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

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

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

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

但只读!

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

于 2020-04-13T23:30:06.733 回答
-3

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

HttpContext.Current.Response.Cookies.Add(cookie);
于 2013-04-05T07:29:49.897 回答