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