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

Pet*_*ann 4 signalr

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

这里描述了使用cookie和自定义SignalR IConnectionIdFactory的策略.但该文章的作者说"SignalR团队不推荐这一行动".那么推荐的架构是什么?

Lar*_*ner 6

您可以在客户端连接时将临时连接ID映射到永久用户ID /名称(可能存储在您的数据库中).请参阅ShootR示例(这是我上次检查过的).例如,您可以保留一个ConcurrentDictionary对象,这些对象表示您跟踪活动用户的用户,并将它们与其连接ID相关联OnConnected(并将其还原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();
}
Run Code Online (Sandbox Code Playgroud)