SignalR:如何生存意外页面刷新

时间:2013-12-11 13:48:35

标签: signalr

想象一下,使用SignalR的两个浏览器客户端之间有一个聊天网络应用程序。在其中一位客户做出意外F5命中的最佳方法是什么?

Here描述了使用cookie和自定义SignalR IConnectionIdFactory的策略。但该文章的作者说“SignalR团队不建议采取这一行动”。那么推荐的架构是什么?

1 个答案:

答案 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();
}