我正在使用带有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);
}
}
答案 0 :(得分:0)
将用户连接状态保存在单独的数据库表中,例如在Connections表中具有外键的User表。在Hub for OnConnected和OnDisconnected事件的连接表中设置connection-id状态。这有助于跟踪用户连接状态。
Redis背板完全用于扩展您的应用程序,以支持用户通过负载平衡环境连接到不同节点。