Как использовать экземпляр концентратора SignalR вне линии хабпиплайна
Я использую SignalR для трансляции сообщений всем своим клиентам. Мне нужно запустить трансляцию за пределами моего класса хаба, например, как показано ниже:
var broadcast = new chatHub();
broadcast.Send("Admin","stop the chat");
Я получаю сообщение об ошибке как:
Использование экземпляра Hub, не созданного HubPipeline, не поддерживается.
2 ответа
Вам нужно использовать GetHubContext
:
var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>();
context.Clients.All.Send("Admin", "stop the chat");
Более подробно это описано на http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server.
Небольшое обновление для тех, кому интересно, где GlobalHost
исчез. SignalR был полностью переписан для ядра.net. Поэтому, если вы используете пакет SignalR.Core ( разница между версиями SignalR), вы получаете экземпляр контекста концентратора SignalR, внедряя его в свой сервис:
public class MyNeedyService
{
private readonly IHubContext<MyHub> ctx;
public MyNeedyService(IHubContext<MyHub> ctx)
{
this.ctx = ctx;
}
public async Task MyMethod()
{
await this.ctx.All.SendAsync("clientCall");
}
}
И в Startup.cs
:
services.AddSignalR()/*.AddAzureSignalR("...")*/;
Документ Microsoft находится здесь: Отправляйте сообщения SignalR извне.