SignalR:使用多个集线器管理 OnDisconnect()

SignalR: Managing OnDisconnect() with multiple hubs

我有一个 SignalR 应用程序,它使用数据库管理用户和连接、用户/房间。我关注了以下文章(在永久,外部存储 -> 数据库下)

http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections

当有人登录时,我将他们的条目插入房间 table,并在他们离开时将其删除。

我现在有两个集线器,"Chat" 和 "Game"。

例如,让 UserA 进入聊天和游戏中心。我在聊天 table 和游戏 table 中创建了 2 个条目。但是,如果 UserA 'non-graceful' 关闭单个集线器(即关闭选项卡),我无法选择 room/hub UserA 与哪个集线器断开连接。 (OnDisconnect 不允许我捕获这些细节)。这迫使我删除在我的数据库

中找到的所有 tables 中所有出现的 UserA

现在我怎么可能知道 UserA 从哪个集线器退出,这样我就可以只删除他在那个特定房间的条目。 (例如,用户 A 在游戏室聊天室中。他关闭了游戏室window。应用程序只需要从 游戏室 table 中删除他的条目。)

非常感谢任何意见和建议。

在 SignalR Hub 中调用的每个方法中,您都可以通过 this.Context.ConnectionId 访问唯一的 ConnectionId。你应该 link 这个 id 给用户。

进入 OnDisconnected 处理程序后,使用 ConnectionId 了解哪个用户已离开。

并且根据this article

The connection ID is a GUID that is assigned by SignalR (you can't specify the value in your own code). There is one connection ID for each connection, and the same connection ID is used by all Hubs if you have multiple Hubs in your application.

我所做的是当用户连接时,在 OnConnected 方法中,我只是将他们的 ConnectionId 添加到数据库中的一个键,类似于:

UserId:HubName:ConnectionId

我通过反思得到的HubName部分:Type.GetType().Name

我使用这个密钥在用户连接时添加到数据库中,并在 OnDisconnected 被调用时从同一个数据库中删除它。

现在请记住,如果服务器在某个时候出现故障,OnDisconnected 方法不会被调用,因此您将留在数据库中,其中包含一些 ConnectionId认为属于某个用户,但实际上已经不属于了。

每次服务器启动时,我都会在数据库中搜索 ConnnectionId 并验证它们是否真的处于活动状态(很可能不是)并删除它们。

希望这对您有所帮助。祝你好运!