7

嗨,

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

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

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

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

我担心我的实现来处理与聊天断开连接的用户,但我看不到另一种改进方法。

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

更新:我最终使用了一个单例类来存储来自 signalr 的所有用户及其连接 ID。这样,我可以在断开连接任务期间从用户那里获取 id(此时您没有任何 httpcontext 来获取用户信息,但是您始终可以从单例中的数组中获取带有 signalr 的连接 id 的用户 id班级)。

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

4

1 回答 1

5

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

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

于 2012-09-02T09:37:08.357 回答