从服务器上的SignalR集线器设置cookie
本文关键字:集线器 设置 cookie SignalR 服务器 | 更新日期: 2023-09-27 18:01:35
无论如何,我可以从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;
}
这是一个老问题,但万一有人偶然发现它,在signalr 2.0+中有一种方法可以从集线器添加cookie。HttpContextBase可以通过集线器请求上下文访问,所以你可以这样做:
var newCookie = new HttpCookie("cookieName", "cookieValue");
Context.Request.GetHttpContext().Response.Cookies.Add(newCookie);
我最终决定从服务MVC控制器设置cookie,我没有找到无论如何在SignalR调用中设置这个
Signal-R为通信信道。它将尝试假设最好的速度/技术,但会降级,直到它以长轮询的http请求结束。
当前最优的网络连接是使用Websockets建立的,但你不能100%依赖
注意,每个建立的Signal-R连接也生成一个唯一的URL作为连接请求的参数。该参数是"连接id",如果刷新浏览器,它将生成一个新连接。
所以,如果你使用cookie作为会话标识符所以即使用户决定刷新浏览器,你也可以保持会话,要知道cookie值也会在该设备上打开的所有浏览器选项卡之间共享。
您不能从Hub的响应中写入Cookie,但是您可以使用eg。Razor/MVC控制器或纯javascript…在你打开Signal-R连接之前——然后你可以从Context.GetHttpContext().Request.Cookies
集合中读取Cookie值。
BUT READ-ONLY !
关键是,制作"登录系统";在普通的Razor页面或任何你有,然后写你需要的cookie -然后打开Signal-R连接,并利用该会话为任何目的,你可能有。
我选择子类化并使用PersistentConnection而不是Hub,以便在服务器上有更多选项。
在我的情况下,我覆盖OnConnectedAsync和使用connectionId在那里保持连接/会话的跟踪。也许你可以考虑这种方法?
protected override Task OnConnectedAsync(IRequest request, string connectionId)
{
我刚刚尝试了同样的事情,这似乎工作:
HttpContext.Current.Response.Cookies.Add(cookie);