SignalR仅在用户关闭页面/选项卡后调用OnDisconnect

时间:2016-11-21 12:04:29

标签: c# jquery asp.net webforms signalr

所以我使用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);
}

用户只应在点击按钮时关闭(注销按钮) 或当他关闭标签/页面时。 我该怎么办?

2 个答案:

答案 0 :(得分:0)

stopCalled表示客户端是否disconnected gracefully or not,因此您当前的方法只会删除连接不存在的用户(例如:网络丢弃)。

有关所有在线用户的列表,计算每个用户的连接数。

OnConnected

  • 如果在列表中找不到该用户,请使用count = 1
  • 添加该用户
  • 如果用户在列表中,则递增计数

<强> OnDisconnected

  • 减少该用户的计数
  • 如果该用户count = 0,请从列表中删除该用户

答案 1 :(得分:0)

如果用户在线,那么他打开了多少窗口并不重要。 您应该通过他们的联系in database跟踪在线用户。

如果用户刷新窗口,则会创建新连接,因此先前的连接最终会断开连接。

像这样的东西,我试着猜猜你应该编码什么。

您应该在数据库OnlineUser中创建一个包含ConnectionIdUserId

列的表格
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);
}

您可能需要进行一些更改以支持一个用户的多个连接。