Как хранить значения в переменных состояния SignalR

1

Я использую OnConnected и OnDisconected, чтобы сохранить ловушку пользователей и сократить объем памяти.

Моя проблема в том, что я не могу назначать какие-либо переменные в SignalR. Я использую следующий код.

Когда я читаю Clients.Caller.userid, он всегда равен нулю. Однако я могу прочитать это сразу после того, как я присвою ему переменную xxSameProcess, не равную null.

Есть что-то, что мне не хватает?

    public override System.Threading.Tasks.Task OnConnected()
    {
        var user = CreateUser();
        Clients.Caller.userid = user.UserId;
        object xxSameProcess = Clients.Caller.userid;

        return base.OnConnected();
    }
    public override System.Threading.Tasks.Task OnDisconnected()
    {
        object xx = Clients.Caller.userid;

        CreateDelete( Clients.Caller.userid );

        return base.OnConnected();
    }
  • 0
    Я вполне уверен, что объект состояния больше не доступен после отключения (событие вызывается после отключения). Вы можете перепроверить, пытаясь получить доступ к своему userId из обычного метода Hub, он должен быть там. Я также думаю, что вы можете использовать ConnectionId для того, чего вы пытаетесь достичь.
  • 0
    Похоже, вы не можете хранить переменные onConnected и OnDisconnected.
Теги:
signalr

1 ответ

1

На моей стороне я храню свою переменную от клиента, когда она подключается

        <script src="~/signalr/hubs"></script>
        <script type="text/javascript">
            (function ($) {
                //some stuff
                $.connection.hub.qs = { 'uid': '@guid' };
                $.connection.hub.start();
            })(jQuery);
        </script>

Я могу получить к нему доступ с сервера с помощью строк запроса

public override Task OnConnected()
    {
        var uid = Context.QueryString["uid"];
        //some stuff

    return base.OnConnected();
}

public override Task OnDisconnected()
{
    var uid = Context.QueryString["uid"];
    //some stuff

    return base.OnDisconnected();
}

public override Task OnReconnected()
{
    var uid = Context.QueryString["uid"];

    //some stuff

    return base.OnReconnected();
}
  • 0
    Возможно, вы захотите объединить это с UserIdProvider. Затем вы можете удалить все вызовы, чтобы получить его из строки запроса.
  • 0
    В моей ситуации я добавляю это сделать, потому что UserIdProvider и текущий пользователь могут отличаться (это были спецификации)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню