Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SignalR: how to survive accidental page refresh

Tags:

signalr

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?

like image 645
Petr Felzmann Avatar asked Dec 11 '13 13:12

Petr Felzmann


1 Answers

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();
}
like image 75
Lars Höppner Avatar answered Sep 25 '22 23:09

Lars Höppner