查找 SignalR 实时连接

Find SignalR live connections

我正在使用带有 SignalR 的 Redis 背板。我有一个问题,但我找不到任何相关信息。

SignalR 客户端是 Windows 表单应用程序。

我正在使用 OnConnected 和 OnDisconnected 事件来处理用户连接。

我有一个 POCO class 用于与 ConnectionId 属性 和其他一些信息(用户名等)的连接。

在 OnConnected 事件中,我使用 ConnectionId 向 Redis 插入新记录,OnDisconnected 事件从 Redis 中删除条目。 我没有在 OnReconnected 事件中做任何事情。

但是现在redis中相同用户名不同connectionid的记录太多了

我可以使用 ConnectionId 检查连接是否有效吗?如果可能的话,我想删除 Redis 中的死连接。

你对同样的记录问题有什么想法吗?

编辑: 首先,我对 OnConnected 事件有一个错误。我不使用 OnConnected 事件。连接 SignalR 后,WinForms 客户端应用程序在 Hub 上触发 Join 事件。

这是用户数据 POCO Class:

public class UserData
{
    public string Id { get; set; }
    public DateTime Connected { get; set; }
    public string UserName { get; set; }
    public string MachineName { get; set; }
    public string ConnectionId { get; set; }
}

加入方法:

public void Join(UserData userData)
{
  _trackUser.Add(userData);
}

我正在通过

在启动中将 _trackuser 对象注入 Hub class
GlobalHost.DependencyResolver.Register

OnDisconnected 事件:

    public override Task OnDisconnected(bool b)
    {
       _trackUser.Remove(Context.ConnectionId);
        return base.OnDisconnected(b);
    }

TrackUser 添加方法:

    public void Add(UserData userData)
    {
        IRedisClient redisClient = Global.RedisClientManager.GetClient();
        using (redisClient)
        {
            IRedisTypedClient<UserData> redisTypedClient = redisClient.As<UserData>();
            UserData store = redisTypedClient.Store(userData);
        }
    }

TrackUser 删除方法:

    public void Remove(string connectionId)
    {
        IRedisClient redisClient = Global.RedisClientManager.GetClient();
        using (redisClient)
        {
            IRedisTypedClient<UserData> redisTypedClient = redisClient.As<UserData>();
            bool removeEntry = redisTypedClient.RemoveEntry("urn:userdata:"+connectionId);
        }
    }

将用户连接状态保存在单独的数据库 table 中,就像用户 table 在连接 table 中具有外键一样。为 OnConnected 和 OnDisconnected events.This 从集线器设置连接 table 中的 connection-id 状态有助于跟踪用户连接状态。

Redis 背板纯粹是为了扩展您的应用程序,以支持用户在负载均衡环境下连接到不同的节点。