查找SignalR实时连接

时间:2015-10-26 13:07:14

标签: signalr signalr-backplane

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

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

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

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

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

但是现在Redis中有太多记录具有相同的用户名和不同的连接ID。

我可以通过ConnectionId检查连接是否存在?如果可能的话我想在Redis中删除死亡的连接。

你对这个记录问题有什么想法吗?

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

这是UserData 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类
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);
        }
    }

1 个答案:

答案 0 :(得分:0)

将用户连接状态保存在单独的数据库表中,例如在Connections表中具有外键的User表。在Hub for OnConnected和OnDisconnected事件的连接表中设置connection-id状态。这有助于跟踪用户连接状态。

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