signalR跟踪连接的用户(signalR tracking connected users)

2019-08-17 07:25发布

我需要检查特定用户是否仍连。

我有以下HashSet的,用于跟踪用户的:

public static class UserHandler
{
    public static HashSet<string> ConnectedIds = new HashSet<string>();
}

因此,在断开连接:

    public override Task OnDisconnected()
    {
        UserHandler.ConnectedIds.Remove(this.Context.ConnectionId);
        if (UserHandler.ConnectedIds.Count == 0)
        {
               // STOP TASK -> SET CANCELLATION
        }
        return base.OnDisconnected();
    }

和连接:

    public override Task OnConnected()
    {
        Logger.Log.file.Info("[TaskActionStatus HUB => OnConnected] Start");

        UserHandler.ConnectedIds.Add(this.Context.ConnectionId);

        // start task only if at least one listener
        if (UserHandler.ConnectedIds.Count < 2)
        {
            // START A TASK -> (WHILE LOOP THAT GETS DATA FROM DB EVERY 2 SEC)
        }

        return base.OnConnected();
    }

现在,当用户只需关闭他/她的浏览器窗口中出现问题。 没有办法,我知道,如果他/她断开。

因此,基于一些问题在这里 ,我所说的每一个客户,并得到回应。 我不知道该怎么做。

我想我会有这样的:

public static void CheckConnectedUsers()
{
    var context = GlobalHost.ConnectionManager.GetHubContext<TaskActionStatus>();
    foreach (var connection in UserHandler.ConnectedIds)
    {
        context.Clients.Client(connection).verifyConnected("online?");
    }
}

但我怎么得到响应,形成客户端?

编辑:这是执行的步骤:

我需要因为连接的用户的确切数目。如果有至少一个用户连接我要开始的任务。 我想,以确保只有1任务正在运行的所有连接的用户<2(启动任务)。 假设这样的情况:2个用户查看使用signalR的页面。 HashSet的现在有两个ID和任务正在运行。 一关闭他/她的浏览器,并在几秒钟后,另一刷新他/她。 现在,第一个(即关闭了他/她的浏览器没有执行OnDisconnected方法,这样的HashSet仍然有他/她的ConnectionId的一个,和一个“刷新”没有执行OnDisonnected然后OnConnected这增加了他的ConnectionId到HashSet的。因此,而不是只有1一个HashSet的ConnectionId和启动任务,HashSet的包含2个(老不再连接,并且刚刚更新了他/她的浏览器中的一个),任务从来没有得到重新开始。

谢谢

Answer 1:

随着SignalR 1.0, OnDisconnected应该始终火灾,甚至当用户关闭其窗口(例外是如果服务器重新启动)。

OnDisconnected可能不会立即解雇,因为如果客户端不“中止”,它被认为是“不干净”的,因为有机会的话,客户端可能会尝试并重新连接(如果你重新连接你有没有根据SignalR的语义断开) 。

默认情况下,它需要大约30秒的服务器调用OnDisconnected一个“不干净”的脱节。 这可以通过重新配置GlobalHost.Configuration.DisconnectTimeout



Answer 2:

我刚才碰到过这个同样的情况。 该onDisconnect并不总是被解雇。 我的解决办法是轮询用户偶尔看看他们是否仍然连接。

Public Sub checkconnections()
    For Each s In users
        Clients.User(s).areYouThere()
    Next
    users = New List(Of String)
    System.Threading.Thread.Sleep(5000)
    checkconnections()
End Sub
Public Sub imHere()
    Dim id = GetClientId()
    If Not users.Contains(id) Then
        users.Add(id)
    End If
    Clients.All.sendCount(count)
End Sub

所以每5秒枢纽发送到所有客户端在用户列表中,然后清除列表。

如果客户端收到了“areYouThere”消息它,然后获取到列表中增加了“imHere的答复。

希望这可以帮助。



文章来源: signalR tracking connected users