Как использовать экземпляр концентратора 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 извне.

Другие вопросы по тегам