0

我正在使用带有 SignalR 的 Redis 背板。我有一个问题,但我找不到任何关于此的内容。

SignalR 客户端是 Windows 窗体应用程序。

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

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

在 OnConnected 事件中,我使用 ConnectionId 向 Redis 插入新记录,并且 OnDisconnected 事件从 Redis 中删除条目。我在 OnReconnected 事件中什么也没做。

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

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

您对同样的记录问题有任何想法吗?

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

这是 UserData POCO 类:

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);
}

我正在通过 Startup 将 _trackuser 对象注入到 Hub 类中

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);
        }
    }
4

1 回答 1

1

将用户连接状态保存在单独的数据库表中,例如在 Connections 表中具有外键的用户表。在集线器的连接表中为 OnConnected 和 OnDisconnected 事件设置连接 ID 状态。这有助于跟踪用户连接状态。

Redis 背板纯粹用于扩展您的应用程序,以支持用户通过负载平衡环境连接到不同的节点。

于 2016-01-14T09:16:48.423 回答