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