Asp.net 获取在信号器中使用IUserProvider时的用户计数

Asp.net 获取在信号器中使用IUserProvider时的用户计数,asp.net,signalr,signalr-hub,Asp.net,Signalr,Signalr Hub,我通读了: 而且。。。我在想,通过设置自定义UserIdProvider,可以避免我必须将连接映射到真实用户,然后缓存它以支持多个服务器,但也许我遗漏了一些东西 我可以向特定用户发送消息: context.Clients.User(“xxx”).method。。。没问题 但是,我无法判断用户id是否已断开连接。。。与此相同,所有具有该用户id的连接id都已释放。这使得用户id提供程序几乎毫无用处,因为我现在被迫创建自己的连接id到唯一用户id的映射,然后在断开连接时删除连接id,这样我就可以知

我通读了:

而且。。。我在想,通过设置自定义UserIdProvider,可以避免我必须将连接映射到真实用户,然后缓存它以支持多个服务器,但也许我遗漏了一些东西

我可以向特定用户发送消息: context.Clients.User(“xxx”).method。。。没问题

但是,我无法判断用户id是否已断开连接。。。与此相同,所有具有该用户id的连接id都已释放。这使得用户id提供程序几乎毫无用处,因为我现在被迫创建自己的连接id到唯一用户id的映射,然后在断开连接时删除连接id,这样我就可以知道与用户id关联的连接id列表何时为空。我是不是遗漏了什么我想知道给定的用户id是否已连接。这可能吗?最后,我想知道它们何时全部断开连接(即:用户完全断开连接,如…已关闭所有具有连接的选项卡)。

比如:

context.Clients.User(x).HasConnections() or context.Clients.User(x).ConnectionCount
我也看不到调用GetUserId的方法。。。我在其他示例Context.User.GetUserId()中看到了,但我不存在此方法。我用的是最新版本的信号器。我的get user id方法似乎是从信号器本身调用的。现在我必须直接调用它,而不是通过对象模型:

    private string GetUserId(HubCallerContext context)
    {
        return new UserIdProvider().GetUserId(Context.Request);
    }

如果将已连接用户的状态保存在某种数据库或服务器之间的其他共享存储中,则可以执行此操作 然后,您可以在尝试向该ConnectionId发送数据之前查询该数据库

public class MyHub : Hub
    {
        public override Task OnConnected()
        {
            DAL.UserConnected(Context.ConnectionId);
            return base.OnConnected();
        }
        public override Task OnDisconnected()
        {
            DAL.UserNotConnected(Context.ConnectionId);
            return base.OnDisconnected();
        }
    }

谢谢,虽然这是我试图避免的全部事情,但这违背了让用户提供者自动聚合用户的目的。