Событие On на клиенте SignalR Client Hub не вызвано

У меня, похоже, проблема с концентратором SignalR JS.

Проблема заключается в том, что обработчик 'on', похоже, не работает - он не генерирует ошибки, но не получает никаких сигналов, отправленных сервером. В приведенном ниже коде показана выдержка, в которой я вызываю сервер (с помощью вызова), который работает нормально - затем на сервере я перехожу к acceptHubData, который должен быть выбран на клиенте, но это не так.

Моя цель - при навигации по страницам, на которых каждая страница откроет соединение с конкретным концентратором и освободит это соединение, когда пользователь перейдет на другую страницу!

РЕДАКТИРОВАТЬ: использование следующих фрагментов кода работает, но мне интересно, почему следующий код ниже с использованием события 'on' не работает!

    var superHub = $.connection.mySuperHub;

    superHub.client.acceptHubData = function (data) {
        $('<li>hello there' + data + '</li>').prependTo($('#ul1'))
    }

    $.connection.hub.start().done(function () {
        $('<li>done phase 1</li>').prependTo($('#ul1'))
    });

Любая помощь будет очень признательна!

Это код клиента (в js)

$(document).ready(function () {

    var myHub;

    try {

        var connection = $.hubConnection();

        connection.start().done(function () {

            myHub = connection.createHubProxy("mySuperHub");

            myHub.on('acceptHubData', function (data) {
                alert(data);   // THIS IS NOT CALLED!
            });

            myHub.invoke('AcceptSignal', "hello from the client2");

        });

    }
    catch (e) {
        alert(e.message);
    }
});

Это код сервера:

[HubName("mySuperHub")]
public class MyHub : Hub
{

    private readonly HubEngine _hubEngine;

    public MyHub() : this(HubEngine.Instance) { }

    public MyHub(HubEngine hubEngine)
    {
        _hubEngine = hubEngine;
    }

    public void AcceptSignal(string msg)
    {
        Clients.Caller.acceptHubData("hi");
        Clients.All.acceptHubData("hi");
    }

}

Ответы

Ответ 1

Вы все равно можете использовать метод on для добавления событий для вызовов метода хаба клиента JS в последней версии SignalR, но если вы не добавляете прослушивателей событий в hubProxy перед вызовом hubConnection.start(), вы будете не подписываться на концентратор. SignalR подписывается на концентраторы, у которых есть обработчики событий, когда запускается hubConnection. Если вы не подписаны на ваш концентратор, добавление каких-либо событий в этот концентратор после запуска() не будет работать.

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

Не имеет значения, добавляете ли вы событие с помощью hubProxy.on('eventName', function (... или autogeneratedHubProxy.client.eventName = function (... перед вызовом start(), но только on будет успешно добавлять прослушиватели событий после вызова start().

Ответ 2

Не знаете, какую версию SignalR вы используете, но у меня был больше успеха, используя следующий синтаксис на моем сервере:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.acceptHubData("hello");    

и моих клиентов:

myHub.client.acceptHubData = function (data) {
    console.log(data);
}