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

时间:2015-08-11 19:54:54

标签: c# asp.net signalr signalr-hub

我有一个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位于游戏室聊天室。他关闭了游戏室窗口。应用程序只需从游戏室表。)

任何意见,建议都非常感谢。

2 个答案:

答案 0 :(得分:1)

在SignalR Hub中调用的每种方法中,您都可以访问唯一的ConnectionIdthis.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并检查它们是否实际处于活动状态(很可能不是)并删除它们。

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