我有一个SignalR应用程序,用于管理用户和连接,用户/房间,数据库。我遵循了以下文章(在永久,外部存储 - > 数据库下)
http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections
当有人登录时,我将他们的条目插入Room表中,并在他们离开时将其删除。
我现在有两个中心,"聊天"和#34;游戏"。
让我们举例说明UserA进入聊天和游戏中心。我在Chat表和Game表中创建了两个条目。但是,如果UserA做了一个非优雅的'关闭单个集线器(即关闭标签),我无法选择UserA与哪个房间/集线器断开连接。 (OnDisconnect不允许我捕获这些细节)。这迫使我在我的数据库中找到的所有表中删除所有出现的UserA
现在我怎么可能知道UserA退出哪个中心,以便我只能删除该特定房间的条目。 (例如,UserA位于游戏室和聊天室。他关闭了游戏室窗口。应用程序只需从游戏室表。)
任何意见,建议都非常感谢。
答案 0 :(得分:1)
在SignalR Hub
中调用的每种方法中,您都可以访问唯一的ConnectionId
到this.Context.ConnectionId
。您应该将此ID链接到用户。
进入OnDisconnected
处理程序后,使用ConnectionId
知道哪个用户已离开。
根据this article:
连接ID是由SignalR分配的GUID(您无法在自己的代码中指定值)。每个连接都有一个连接ID,如果您的应用程序中有多个集线器,则所有集线器都使用相同的连接ID。
答案 1 :(得分:1)
我所做的是当用户连接时,在OnConnected
方法中,我只需将他们的ConnectionId
添加到数据库中类似于以下内容的键中:
UserId:HubName:ConnectionId
HubName
部分我通过反思:Type.GetType().Name
当用户连接时,我使用此密钥添加到数据库中,并在调用OnDisconnected
时将其从同一数据库中删除。
现在,请记住,如果服务器在某些时候失败,则不会调用OnDisconnected
方法,因此您将在数据库中保留一些您认为属于的ConnectionId
个对用户而言,他们实际上不再这样做了。
每次服务器启动时,我都会在数据库中搜索ConnnectionId
并检查它们是否实际处于活动状态(很可能不是)并删除它们。
希望这会有所帮助。祝你好运!