Signalr 使用WebSocket的信号器在活动连接期间登录/注销时保持相同的用户身份

Signalr 使用WebSocket的信号器在活动连接期间登录/注销时保持相同的用户身份,signalr,Signalr,我正在server2012上运行ASP.NET MVC 4.5应用程序,使用带有启用WebSocket设置的信号器 页面上有“登录/注销”按钮,我必须在服务器上保持活动连接 当服务器用于传输serverSentEvents时,一切正常,当用户更改身份验证时,我得到了回调 $.connection.hub.error(function (error) { // stop current signalR connection and start new one cre

我正在server2012上运行ASP.NET MVC 4.5应用程序,使用带有启用WebSocket设置的信号器

页面上有“登录/注销”按钮,我必须在服务器上保持活动连接

当服务器用于传输serverSentEvents时,一切正常,当用户更改身份验证时,我得到了回调

$.connection.hub.error(function (error) {
    // stop current signalR connection and start new one        
    createNewConnection();
});
但当我为WebSocket设置服务器时,它停止调用错误函数。我在论坛上发现,常见的解决方案是定期ping服务器并更新cookies,但当我使用Signal-websockets ping服务器时,服务器无法识别用户身份已更改

基本上,当我与已登录的用户启动连接,然后单击“注销”时,服务器将保持websocket连接不变,用户身份相同:

Context.User.Identity.Name 
用户注销后将保持相同


我知道用户身份在活动信号器连接期间无法更改,但我需要检查Cookie是否没有更改,因为它可以从另一个打开的选项卡或窗口更改。

因此,您所看到的是100%预期的。对于除WebSocket之外的所有传输,它们都具有间歇性通信

例如:SSE—有1个连接是建立的,从未中断过以接收信息,并且每当您尝试将数据从客户端发送到服务器时,都会触发AJAX请求,AJAX请求是间歇性请求

现在,在对服务器的每个请求上,信号器都会验证用户身份。因此,对于SSE中发送的每个客户端->服务器,都会验证用户身份。然而,在WebSocket中,只有一个请求处于活动状态(用于实例化连接),并通过连接双向发送和接收流

因此,由于WebSockets只有一个请求,所以它永远不知道标识更改

另一方面,如果您使用的是SignalR 2.0.0+,您的连接将在5分钟的时间跨度内获知无效的用户标识(SignalR每5分钟向服务器发送一次ajax请求)


希望这些信息有帮助

谢谢Taylor,我想检查用户身份是否已更改的最好方法是使用ajax请求ping服务器。