Подтвердить что ты не робот

SignalR - Установить ClientID вручную

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

4b9b3361

Ответ 1

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

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

EDIT. Это больше не поддерживается в последних версиях SignalR. Но вы можете определить идентификатор пользователя для определенного соединения с помощью нового IUserIdProvider

Ответ 2

В SignalR версии 1, использующем подход Hubs, я переопределяю метод Hub OnConnected() и сохраняю ассоциацию .NET membership userId с текущим идентификатором соединения (Context.ConnectionId) в базе данных SQL.

Затем я переопределяю метод Hub OnDisconnected() и удаляю ассоциацию между .NET membership userId и текущим идентификатором соединения. Это означает, что при перезагрузке страницы ассоциация 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 из ассоциации (ов) базы данных с текущим идентификатором пользователя - может быть несколько ассоциаций, если задействованы несколько экземпляров браузера.

Ответ 3

В документе SignalR Клиентская сторона описывается следующее:

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

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