[英]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.