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.

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 .


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.