繁体   English   中英

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

[英]SignalR: Managing OnDisconnect() with multiple hubs

我有一个SignalR应用程序,可以管理用户和数据库的用户和连接。 我关注了以下文章(在“ 永久外部存储 -> 数据库”下

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

当有人登录时,我将其条目插入“房间”表,并在离开时将其删除。

我现在有两个中心,“聊天”和“游戏”。

例如,让用户A进入聊天和游戏中心。 我在“聊天”表和“游戏”表中都创建了2个条目。 但是,如果UserA对单个集线器进行了“非正常”关闭(即“关闭”选项卡),我将无法选择UserA断开连接的房间/集线器。 (OnDisconnect不允许我捕获这些详细信息)。 这迫使我删除在数据库中找到的所有表中所有出现的UserA

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

任何意见,建议,不胜感激。

在SignalR Hub调用的每个方法中,您都可以通过this.Context.ConnectionId来访问唯一的ConnectionId 您应该将此ID链接到用户。

进入OnDisconnected处理程序后,使用该ConnectionId知道哪个用户离开了。

并根据这篇文章

连接ID是SignalR分配的GUID(您无法在自己的代码中指定值)。 每个连接只有一个连接ID,如果您的应用程序中有多个集线器,则所有集线器都使用相同的连接ID。

我要做的是,当用户连接时,在OnConnected方法中,我只需将其ConnectionId添加到数据库中的键中,该键类似于:

UserId:HubName:ConnectionId

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

我使用此密钥在用户连接时添加数据库,并在调用OnDisconnected时将其从同一数据库中删除。

现在,请记住,如果服务器在某个时刻出现故障,则不会调用OnDisconnected方法,因此您会在数据库中留下一些您认为属于用户的ConnectionId ,但实际上不再使用它们。

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

希望这可以帮助。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM