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