在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);
}
我可以检查空组吗?
最佳答案
我认为这将是对您的问题的较晚答复,也许您已经忘记了: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);
}
关于asp.net-mvc-4 - 检查组是否为空SignalR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25957312/