SignalR - установить ClientID вручную - PullRequest
18 голосов
/ 07 марта 2012

Я хочу, чтобы отдельные пользователи могли отправлять сообщения друг другу с помощью SignalR, поэтому мне нужно отправить идентификатор конкретного клиента.Как определить идентификатор клиента для конкретного пользователя в начале сеанса - скажем, первичный ключ GUID для пользователя?

Ответы [ 3 ]

23 голосов
/ 08 марта 2012

Замените IConnectionIdFactory своим собственным https://github.com/SignalR/SignalR/wiki/Extensibility.

Пример использования: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

EDIT : это больше не поддерживается в последних версиях SignalR.Но вы можете определить идентификатор пользователя для конкретного соединения, используя новый IUserIdProvider

6 голосов
/ 21 ноября 2012

В версии 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 - может быть несколько ассоциаций, если задействовано несколько экземпляров браузера.

3 голосов
/ 24 апреля 2012

В документации SignalR на стороне клиента указано следующее:

connection.id - Получает или задает идентификатор клиента для текущего соединения

Это, безусловно, указывает на то, что нужно иметь возможность установить клиентскую сторону clientID, без всего вышеперечисленного. Это не работает? Если работает, как будет выглядеть эта строка кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...