Событие On в клиентском концентраторе SignalR не вызывается

Кажется, у меня проблема с JS Client Hub SignalR.

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

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

EDIT: использование следующего фрагмента кода работает, но мне интересно, почему приведенный ниже код с использованием события 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");
    }

}

person Marcel    schedule 17.04.2013    source источник
comment
См. этот stackoverflow.com/a/42527962/1770868.   -  person Ahmad Aghazadeh    schedule 01.03.2017


Ответы (2)


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

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

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

person halter73    schedule 17.04.2013
comment
Фантастика - это действительно работает - никогда бы не догадался! Я проверил это, добавив несуществующее событие, и это тоже работает! Спасибо - person Marcel; 18.04.2013
comment
Чувак, я рвал на себе волосы (то немногое, что у меня осталось), пытаясь понять, что я сделал не так. Подписка до того, как вы вызвали start, казалось обратным, но, видимо, это то, что вам нужно сделать. К сведению: я использовал метод on(), и он не сработал бы, если подписаться после start(). - person Zach; 27.04.2016
comment
Я искал в Интернете, что может быть причиной того, что мои слушатели не работают, и нашел это. Большое спасибо!! Добавление фиктивного обработчика событий прямо перед запуском в концентраторном соединении называется исправлением, даже если все остальные обработчики событий возникают после запуска. -Майк - person mike gold; 02.08.2020

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

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

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

myHub.client.acceptHubData = function (data) {
    console.log(data);
}
person paul    schedule 17.04.2013
comment
спасибо за ответ - это действительно работает - я хотел бы понять, почему принцип события «включено» не работает - см. Мое редактирование! - person Marcel; 17.04.2013
comment
потенциально вы можете искать документацию для более старой версии signalr. Конечно, этот подход рекомендуется в документации здесь: github.com/ SignalR/SignalR/wiki/SignalR-JS-Client-Hubs - person paul; 17.04.2013
comment
Я смотрел на этот github.com /SignalR/SignalR/вики/ - person Marcel; 17.04.2013