Событие 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);
}