我正在使用带有websockets的设置的SignalR在server2012上运行ASP.NET MVC 4.5应用程序。
在页面上有“登录/注销”按钮,我必须在服务器上维护活动连接。
当用于传输serverSentEvents的服务器一切正常时,当用户更改身份验证时,我得到了回调
$.connection.hub.error(function (error) {
// stop current signalR connection and start new one
createNewConnection();
});
但是当我为websockets设置服务器时,它停止调用错误函数。我在论坛中发现常见的解决方案是定期ping服务器并更新cookie,但是当我使用signalR - websockets ping服务器时,服务器无法识别用户身份已经改变。
基本上当我开始与已经登录的用户建立连接然后单击注销时,服务器将保持websocket连接不变,具有相同的用户身份:
Context.User.Identity.Name
用户退出后将是相同的。
我知道在主动signalR连接期间用户身份无法更改,但我需要检查cookie是否没有更改,因为它可以从另一个打开的选项卡或窗口更改。
答案 0 :(得分:3)
所以你所看到的是100%预期。除了WebSockets之外,所有传输都会间歇性地进行通信。
Ex:SSE - 已经建立了1个连接并且从未中断以接收信息,并且每当您尝试从客户端向服务器发送数据时都会触发AJAX请求,AJAX请求是间歇性请求。
现在,在每次向服务器发出请求时,SignalR会验证用户身份。 Sooo为每个客户 - >服务器在SSE中发送验证用户身份。但是,在WebSockets中,只有1个请求处于活动状态(实例化连接),并通过连接双向发送和接收流。
因此,由于WebSockets只有1个请求,因此它永远不会知道身份变化。
另一方面,如果您使用SignalR 2.0.0+,您的连接将在5分钟的时间跨度内获知无效的用户身份(SignalR每5分钟向服务器发送一次ajax请求)。
希望这些信息有所帮助!