从服务器上的SignalR集线器设置cookie

时间:2013-02-27 13:21:54

标签: c# asp.net signalr

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

5 个答案:

答案 0 :(得分:2)

我最终决定从服务的MVC控制器设置cookie,但我没有找到在SignalR调用中设置它。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我选择了子类并使用PersistentConnection而不是Hub来在服务器上提供更多选项。

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

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

答案 3 :(得分:0)

Signal-R是一个通信通道。它将尝试采用可能的最佳速度/技术,但是会很好地降级,直到最终出现长时间轮询的HTTP请求。

当前最理想的网络连接是使用Websocket建立的,但您不能依靠那100%

请注意,每个建立的Signal-R连接ALSO都会生成一个UNIQUE URL作为连接请求的参数。此参数是“连接ID”,如果刷新浏览器,它将生成一个新的参数。

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

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

但只能阅读!

要点是,在普通的Razor页面或您所拥有的任何东西上建立“登录系统”,然后编写所需的cookie-然后打开Signal-R连接并出于任何目的使用该会话。 / p>

答案 4 :(得分:-2)

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

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