SignalR: Hub OnConnected не вызывается, если нет клиентских методов - программирование
Подтвердить что ты не робот

SignalR: Hub OnConnected не вызывается, если нет клиентских методов

Я пишу игру в SignalR. Идея заключается в том, что вы подключаетесь к ноутбуку, который будет использоваться как "дисплей", а затем вы подключаетесь к вашему смартфону и который будет использоваться как "джойстик". Вся настройка работает очень хорошо.

Теперь, когда все это работает, я решил реорганизовать код. Я понял, что связь между джойстиком и дисплеем является одним из способов (дисплею никогда не нужно отправлять информацию обратно на джойстик). Поэтому я решил, что мне не нужны никакие функции вызова invictable на джойстике (например, нет смысла использовать gameHub.client.joyStickMethod() в джойстике js.

Тогда я обнаружил что-то странное

Оказывается, метод hub public override Task OnConnected(), который я переопределяю для работы с разными типами клиентов (дисплеи и джойстики), не вызывается, если я не определяю myHub.client.clientSideMethod(). Вот пример, который я имею в виду:

        var gameHub = $.connection.gameHub;
        gameHub.client.connection();
        $("#joystick").joystick({
            hub: gameHub
        });

        gameHub.client.activateJoystick = function () { };
        $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
        $.connection.hub.start();   //this will invoke on connected

Вы видите этот пустой метод на стороне клиента? Причина, по которой OnConnected вызывается на стороне сервера. Если я удалю эту строку кода, она не будет вызываться.

        var gameHub = $.connection.gameHub;
        gameHub.client.connection();
        $("#joystick").joystick({
            hub: gameHub 
        });

        //gameHub.client.activateJoystick = function () { };
        $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
        $.connection.hub.start();   //this will invoke on connected

Это не сработает, поскольку на узле не существует метода клиентской стороны. Вероятно, я могу добавить метод RegistrateJoystick на концентратор и вызвать это, но я думаю, что поведение неожиданно. Поэтому мой вопрос:

Есть ли способ вручную "подключиться" к концентратору, так что будет вызван метод OnConnect?

4b9b3361

Ответ 1

Это по дизайну. Если у вас нет подписки на концентратор, то этот конкретный клиент не сможет получать сообщения от сервера к клиенту. Вы все равно можете вызывать методы на концентраторе.

Ответ 2

Кстати, это просто иметь поддельный концентратор, к которому вы подключаетесь. Не делает ничего, возвращает пустоту. По крайней мере, когда вы загрузите свою игру, прежде чем вы вызовете .start() в соединении, вы подключаетесь к этому поддельному методу на фальшивом хабе. Это даст вам метод onConnected().

Я согласен, это такое странное поведение. Если вы устанавливаете соединение, необходимо активировать onConnected(), даже если вы не слушаете события.

Что делает это еще более странным, если вы выполняете авторизацию концентратора. Если вы вышли из AuthorizeAttribute, в вашем случае, AuthorizeHubMethodInvokation() будет вызываться для каждого метода, который вы вызываете на клиенте, но AuthorizeHubConnection() никогда не будет вызываться.

- Update

Я играл с этим в своем проекте. У меня была внутренняя идея создания прокси-сервера-концентратора на клиенте, который не существует на сервере, но это не удается. Тем не менее, вы можете просто подключиться к реальному хабу, но поддельный обратный вызов. Это действительно работает и позволяет вам избежать создания реального метода.

Это явно ужасная работа, но перед лицом ничего другого не делает работу.