SignalR - 处理断开连接的用户

HY,

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

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

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

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

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

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

Update :我最终使用单例类来存储来自signalr的所有用户及其连接ID . 这样我就可以在断开连接任务期间从用户那里获取id(此时你没有任何httpcontext来获取用户信息,但你总是可以从单例中的数组中获取具有signalr连接ID的用户id)类) .

20-02-2013 虽然上面的解决方案正在完成这项工作,但我还是需要扩展我的项目 . 我的解决方案是使用Redis存储所有用户连接,并利用断开连接事件的密钥到期时间 . 在重新连接期间,我检查密钥是否处于暂挂状态(将在几分钟后过期) .

回答(1)

2 years ago

您可以查看JabbR(一种基于SignalR构建的多房间聊天应用程序)如何解决此问题:https://github.com/JabbR/JabbR/blob/master/JabbR/Hubs/Chat.cs

它基本上保持User < - > ConnectionId的1:N映射,因此当最后一个连接断开时,用户可以被标记为“离线” .