Signalr 信号机-处理断开连接的用户

Signalr 信号机-处理断开连接的用户,signalr,Signalr,Hy 我在一个项目中使用signalR库来处理通知和聊天模块。我在数据库中有一个表来跟踪在线用户 聊天中心正在继承IDisconnect,我在其中断开了用户的连接。断开用户连接后,我会让用户了解该事件。此时,我检查断开连接的用户是否是客户端。如果是,那么我调用HUB上的一个方法来重新连接用户(只需更新表) 我这样做是因为在当前的实现中,一旦用户关闭浏览器上的一个选项卡,它就会调用断开连接任务,但他可以打开另一个选项卡 我还没有测试(使用更大的请求)这个模块,但是在我的开发服务器上,IDiscon

Hy

我在一个项目中使用signalR库来处理通知和聊天模块。我在数据库中有一个表来跟踪在线用户

聊天中心正在继承IDisconnect,我在其中断开了用户的连接。断开用户连接后,我会让用户了解该事件。此时,我检查断开连接的用户是否是客户端。如果是,那么我调用HUB上的一个方法来重新连接用户(只需更新表)

我这样做是因为在当前的实现中,一旦用户关闭浏览器上的一个选项卡,它就会调用断开连接任务,但他可以打开另一个选项卡

我还没有测试(使用更大的请求)这个模块,但是在我的开发服务器上,IDisconnect事件和用户再次连接的请求之间可能需要几秒钟的时间

我关心我的实现,以处理断开连接的用户从聊天,但我看不到另一种方法来改善这一点

如果可能的话,有人能给我一个建议吗,或者这是我唯一的解决方案

更新:我最终使用一个单例类来存储来自signalr的所有用户及其连接id。通过这种方式,我可以在断开连接任务期间从用户处获取id(此时您没有任何httpcontext来获取用户信息,但您始终可以从singleton类中的数组中获取连接id为signalr的用户id)

20-02-2013尽管上面的解决方案很有效,但我需要扩展我的项目。我的解决方案是使用Redis存储所有用户连接,并利用断开连接事件的密钥过期时间。在重新连接过程中,我会检查密钥是否处于挂起状态(几分钟后就会过期)。

您可以查看构建在Signal之上的多房间聊天应用程序如何解决此问题:


它基本上保留了UserConnectionId的1:N映射,因此当最后一个连接断开时,用户可以标记为“脱机”。

非常感谢,该项目非常有用。我将遵循超时方法你能在你的答案中内联任何“JabbR…如何解决这个问题”吗?@MichaelPalukonis它基本上保持UserConnectionId的1:N映射,因此当最后一个连接断开时,用户可以标记为“脱机”.一年后,我发现FB Tornado是用Python构建的,并且遵循非阻塞模式,我说再见信号器;)