HY,
我在项目中使用signalR库来处理通知和聊天模块。我在数据库上有一个表格来跟踪在线用户。
用于聊天的HUB继承了IDisconnect,我断开了用户的连接。断开用户连接后,我会向用户介绍该事件。此时,我检查断开连接用户是否是客户端。如果是,那么我在HUB上调用一个方法来重新连接用户(只需更新表)。
我这样做是因为在当前实现中,一旦用户关闭浏览器上的选项卡,它就会调用Disconnect任务,但他可以打开另一个选项卡。
我还没有对此模块进行测试(有更大的请求),但在我的开发服务器上,IDisconnect事件和用户再次连接请求之间可能需要几秒钟。
我关注我的实现,以处理断开连接的用户聊天,但我看不到另一种方法来改善这一点。
如果可能,有人可以给我一个建议,或者这是我唯一的解决方案吗?
更新:我最终使用单例类来存储来自signalr的所有用户及其连接ID。这样我就可以在断开连接任务期间从用户那里获取id(此时你没有任何httpcontext来获取用户信息,但你总是可以从单例中的数组中获取具有signalr连接ID的用户id)类)。
20-02-2013 虽然上述解决方案正在完成这项工作,但我还是需要扩展我的项目。我的解决方案是使用Redis存储所有用户连接,并利用断开连接事件的密钥到期时间。在重新连接期间,我检查密钥是否处于暂挂状态(将在几分钟后过期)。
答案 0 :(得分:5)
您可以查看基于SignalR构建的多房间聊天应用JabbR如何解决此问题:https://github.com/JabbR/JabbR/blob/master/JabbR/Hubs/Chat.cs
它基本上保持用户< - > ConnectionId的1:N映射,因此当最后一个连接断开时,用户可以被标记为“离线”。