【问题标题】:Find SignalR live connections查找 SignalR 实时连接
【发布时间】:2016-01-25 14:24:49
【问题描述】:

我正在使用带有 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);
}

我正在通过

将 _trackuser 对象注入 Startup 中的 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);
        }
    }

【问题讨论】:

  • 你可能会添加一些代码?

标签: signalr signalr-backplane


【解决方案1】:

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

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

【讨论】:

  • 谢谢。看起来不错的方法。
猜你喜欢
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 2013-04-16
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2023-03-11
相关资源
最近更新 更多