所以我使用signalR来拥有在线用户列表。
我使用stopCalled
来避免页面刷新就像断开连接一样,但现在用户永远不会断开连接..
public override Task OnDisconnected(bool stopCalled)
{
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var currentUser = manager.FindByName(Context.User.Identity.Name);
string name = currentUser.NickName;
if (!(stopCalled))
{
var item = users.SingleOrDefault(x => x.Nick == name);
if (item != null)
users.Remove(item);
userNames.Remove(name);
Clients.All.hubReceived(users);
}
return base.OnDisconnected(stopCalled);
}
用户只应在点击按钮时关闭(注销按钮) 或当他关闭标签/页面时。 我该怎么办?
答案 0 :(得分:0)
stopCalled
表示客户端是否disconnected gracefully or not,因此您当前的方法只会删除连接不存在的用户(例如:网络丢弃)。
有关所有在线用户的列表,计算每个用户的连接数。
OnConnected
count = 1
<强> OnDisconnected 强>
count = 0
,请从列表中删除该用户答案 1 :(得分:0)
如果用户在线,那么他打开了多少窗口并不重要。
您应该通过他们的联系in database
跟踪在线用户。
如果用户刷新窗口,则会创建新连接,因此先前的连接最终会断开连接。
像这样的东西,我试着猜猜你应该编码什么。
您应该在数据库OnlineUser
中创建一个包含ConnectionId
和UserId
public override Task OnConnected()
{
var onlineUserManager = NewOnlineUserManager<OnlineUser>(new OnlineUserStore<OnlineUser>(new ApplicationDbContext()));
var onlineUser = onlineUserManager.FindByConnectionId(Context.ConnectionId);
if (onlineUser == null)
{
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var currentUser = manager.FindByName(Context.User.Identity.Name);
onlineUser = new OnlineUser
{
ConnectionId = Context.ConnectionId,
UserId = currentUser.Id
};
onlineUserManager.Save(onlineUser);
}
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
if (stopCalled)
{
var onlineUserManager = NewOnlineUserManager<OnlineUser>(new OnlineUserStore<OnlineUser>(new ApplicationDbContext()));
var onlineUser = onlineUserManager.FindByConnectionId(Context.ConnectionId);
if (onlineUser != null)
{
onlineUserManager.Remove(onlineUser);
}
}
return base.OnDisconnected(stopCalled);
}
您可能需要进行一些更改以支持一个用户的多个连接。