Jak używać wystąpienia centrum SignalR poza hubpipleline

81

Używam SignalR do emisji wiadomości do wszystkich moich klientów. Muszę wyzwolić nadawanie poza moją klasą koncentratora, tj. Coś takiego jak poniżej:

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

Otrzymuję komunikat o błędzie jako:

Korzystanie z wystąpienia centrum, które nie zostało utworzone przez HubPipeline, nie jest obsługiwane.

Nitin Agrawal
źródło

Odpowiedzi:

140

Musisz użyć GetHubContext:

var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>();
context.Clients.All.Send("Admin", "stop the chat");

Opisano to bardziej szczegółowo pod adresem http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub .

kantar 73
źródło
4
„context.Clients.All.Send” nie jest rozgłaszana z powrotem do dzwoniącego, tylko do innych. jakieś pomysły?
user384080
4
Jeśli używasz, GetHubContextnie ma dzwoniącego, ponieważ ma to być używane poza centrum. Clients.Allpowinien odnosić się do każdego klienta, który jest aktualnie połączony z centrum.
halter73,
5
Mam ten sam kod, ale metoda Send ani żadna inna metoda nie zostanie wywołana.
nAviD
5
To nie daje instancji koncentratora, ale daje instancję IHubContext. Nie można tego użyć do wywołania metod centrum.
George Mauer
4
To zadziałało dla mnie z JEDNĄ zmianą: context.Clients.All.broadcastMessage("Admin", "stop the chat"); użyj broadcastMessage zamiast Send.
Wheel Builder
4

Mała aktualizacja dla tych, którzy mogą się zastanawiać, dokąd się GlobalHostpodział. SignalR został całkowicie przepisany dla .net core. Więc jeśli używasz pakietu SignalR.Core ( różnica między wersjami SignalR ), otrzymasz wystąpienie kontekstu centrum SignalR przez wstrzyknięcie go do usługi:

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");
    }
}

A w Startup.cs:

services.AddSignalR()/*.AddAzureSignalR("...")*/;

Microsoft Docu jest tutaj: wysyłaj wiadomości SignalR spoza centrum .

Maxim Zabolotskikh
źródło