Verwendung der SignalR-Hub-Instanz außerhalb der Hubpipleline

79

Ich verwende SignalR, um Nachrichten an alle meine Kunden zu senden. Ich muss die Übertragung außerhalb meiner Hub-Klasse auslösen, dh wie folgt:

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

Ich erhalte die Fehlermeldung:

Die Verwendung einer Hub-Instanz, die nicht von HubPipeline erstellt wurde, wird nicht unterstützt.

Nitin Agrawal
quelle

Antworten:

139

Sie müssen verwenden GetHubContext:

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

Dies wird ausführlicher unter http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub beschrieben .

halter73
quelle
4
"context.Clients.All.Send" sendet nicht an den Anrufer zurück, sondern nur an die anderen. irgendwelche Ideen?
user384080
4
Wenn Sie verwenden, GetHubContextgibt es keinen Anrufer, da dieser außerhalb eines Hubs verwendet werden soll. Clients.Allsollte jeden Client ansprechen, der derzeit mit dem Hub verbunden ist.
halter73
5
Ich habe den gleichen Code, aber die Methode Send oder eine andere Methode würde nicht aufgerufen.
nAviD
5
Dadurch erhalten Sie keine Instanz des Hubs, sondern eine Instanz von IHubContext. Sie können dies nicht zum Aufrufen von Hub-Methoden verwenden.
George Mauer
4
Dies funktionierte bei mir mit EINER Änderung: context.Clients.All.broadcastMessage("Admin", "stop the chat"); Verwenden Sie BroadcastMessage anstelle von Senden.
Wheel Builder
4

Ein kleines Update für diejenigen, die sich fragen, wohin das GlobalHostgegangen ist. SignalR wurde für .net Core komplett neu geschrieben. Wenn Sie also das SignalR.Core-Paket ( Unterschied zwischen SignalR-Versionen ) verwenden, erhalten Sie eine Instanz des SignalR-Hub-Kontexts, indem Sie ihn in Ihren Dienst einfügen:

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

Und in Startup.cs:

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

Microsoft- Dokument ist hier: Senden Sie SignalR-Nachrichten von außerhalb des Hubs .

Maxim Zabolotskikh
quelle