检查组是否为空SignalR?

时间:2014-09-21 08:25:35

标签: asp.net-mvc-4 signalr signalr-hub

在OnConnected方法中,客户端以其名称(组包含所有客户端ID)添加到组中,如果该名称不存在,则将其名称添加到列表中。

static List<string> onlineClients = new List<string>(); // list of clients names

public override Task OnConnected()
{
    Groups.Add(Context.ConnectionId, Context.User.Identity.Name);

    if (!onlineClients.Exists(x => x == Context.User.Identity.Name))
    {
        onlineClients.Add(Context.User.Identity.Name);
    }

    return base.OnConnected();
}

在OnDisconnected方法中,我尝试测试该组是否为空以从列表中删除元素。但删除最后一次连接后,该组不为空。

public override Task OnDisconnected(bool stopCalled)
{
    if (stopCalled)
    {
        // We know that Stop() was called on the client,
        // and the connection shut down gracefully.

        Groups.Remove(Context.ConnectionId, Context.User.Identity.Name);

        if (Clients.Group(Context.User.Identity.Name) == null)
        {
            onlineClients.Remove(Context.User.Identity.Name);
        }

    }
    return base.OnDisconnected(stopCalled);
}

我可以查看空组吗?

1 个答案:

答案 0 :(得分:1)

我认为这对你的问题有点迟到,也许你已经忘记了:d

我使用包含组名(User.Identity.Name)及其客户编号的字典解决了我的问题如下。

private static Dictionary<string, int> onlineClientCounts  = new Dictionary<string, int>();

public override Task OnConnected()
{
    var IdentityName = Context.User.Identity.Name;
    Groups.Add(Context.ConnectionId, IdentityName);

    int count = 0;
    if (onlineClientCounts.TryGetValue(IdentityName, out count))
        onlineClientCounts[IdentityName] = count + 1;//increment client number
    else
        onlineClientCounts.Add(IdentityName, 1);// add group and set its client number to 1

    return base.OnConnected();  
}

public override Task OnDisconnected(bool stopCalled)
{
    var IdentityName = Context.User.Identity.Name;
    Groups.Remove(Context.ConnectionId, IdentityName);

    int count = 0;
    if (onlineClientCounts.TryGetValue(IdentityName, out count))
    {
        if (count == 1)//if group contains only 1client
            onlineClientCounts.Remove(IdentityName);
        else
            onlineClientCounts[IdentityName] = count - 1;
    }

    return base.OnDisconnected(stopCalled);
}