想象一下,使用SignalR的两个浏览器客户端之间有一个聊天网络应用程序。在其中一位客户做出意外F5命中的最佳方法是什么?
Here描述了使用cookie和自定义SignalR IConnectionIdFactory的策略。但该文章的作者说“SignalR团队不建议采取这一行动”。那么推荐的架构是什么?
答案 0 :(得分:6)
当客户端连接时,您可以将临时连接ID映射到永久用户ID /名称(可能存储在数据库中)。请参阅ShootR example这样做(我上次检查过,至少)。
例如,您可以保留一个ConcurrentDictionary对象,表示您跟踪活动用户的用户,并将其与OnConnected
中的连接ID关联起来(并在OnDisconnected
中还原),类似于:
private static readonly ConcurrentDictionary<string, User> Users
= new ConcurrentDictionary<string, User>();
public override Task OnConnected() {
string userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
var user = Users.GetOrAdd(userName, _ => new User {
Name = userName,
ConnectionIds = new HashSet<string>()
});
lock (user.ConnectionIds) {
user.ConnectionIds.Add(connectionId);
}
return base.OnConnected();
}