В версии 1 SignalR с использованием подхода Hubs я переопределяю метод OnConnected () Hub и сохраняю ассоциацию идентификатора членства .NET с текущим идентификатором соединения (Context.ConnectionId) в базе данных SQL.
Затем я переопределяю метод Hub OnDisconnected () и удаляю связь между идентификатором членства .NET и текущим идентификатором соединения. Это означает, что при перезагрузке страницы связь userId / connectionId будет актуальной.
Что-то вроде:
public class MyHub : Hub
{
private MembershipUser _user
{
get { return Membership.GetUser(); }
}
private Guid _userId
{
get { return (Guid) _user.ProviderUserKey; }
}
private Guid _connectionId
{
get { return Guid.Parse(Context.ConnectionId); }
}
public override Task OnConnected()
{
var userConnectionRepository = new UserConnectionRepository();
userConnectionRepository.Create(_userId, _connectionId);
userConnectionRepository.Submit();
return base.OnConnected();
}
public override Task OnDisconnected()
{
var userConnectionRepository = new UserConnectionRepository();
userConnectionRepository.Delete(_userId, _connectionId);
userConnectionRepository.Submit();
return base.OnDisconnected();
}
}
Затем, когда мне нужно вызвать событие SignalR для конкретного пользователя, я могу обработать connectionId из ассоциации (ей) базы данных с текущим userId - может быть несколько ассоциаций, если задействовано несколько экземпляров браузера.