SignalR: how to survive accidental page refresh

2020-02-10 10:02发布

Imagine there is a chat web app between two browser clients using SignalR. What is the best approach to survive accidental F5 hit done by one of the client?

Here is described the strategy using cookies together with custom SignalR IConnectionIdFactory. But the author of the article says "The SignalR team doesn’t recommend this action". So what is the recommended architecture?

标签: signalr
1条回答
老娘就宠你
2楼-- · 2020-02-10 10:07

You can map the temporary connection id to a permanent user id/name (which might be stored in your DB) when the client connects. See the ShootR example which does this (last time I checked, at least). For example, you could keep a ConcurrentDictionary of objects representing users that you track active users with and associate them with their connection ids in OnConnected (and revert this in OnDisconnected) similar to this:

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();
}
查看更多
登录 后发表回答