Как использовать экземпляр концентратора SignalR за пределами Hubpipleline

81

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

var broadcast = new chatHub(); broadcast.Send("Admin","stop the chat");

Я получаю сообщение об ошибке:

Использование экземпляра Hub, созданного не HubPipeline, не поддерживается.

Нитин Агравал
источник

Ответы:

140

Вам нужно использовать 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#callfromoutsidehub .

недоуздок73
источник
4
«context.Clients.All.Send» не транслируется обратно вызывающему абоненту, только другим. есть идеи?
user384080
4
Если вы используете, GetHubContextнет вызывающего абонента, поскольку он предназначен для использования вне концентратора. Clients.Allдолжен адресовать каждого клиента, который в настоящее время подключен к концентратору.
halter73
5
У меня такой же код, но метод Send или какой-либо другой не вызывается.
nAviD
5
Это не дает вам экземпляр хаба, он дает вам экземпляр IHubContext. Вы не можете использовать это для вызова методов концентратора.
Джордж Мауэр,
4
У меня это сработало с ОДНОМ изменением: context.Clients.All.broadcastMessage("Admin", "stop the chat"); использовать broadcastMessage вместо Send.
Wheel Builder
4

Небольшое обновление для тех, кому интересно, куда 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 из-за пределов концентратора .

Максим Заболоцких
источник