Cómo usar la instancia del concentrador de SignalR fuera de hubpipleline

81

Estoy usando SignalR para transmitir mensajes a todos mis clientes. Necesito activar la transmisión fuera de mi clase central, es decir, algo como a continuación:

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

Recibo un mensaje de error como:

No se admite el uso de una instancia de Hub no creada por HubPipeline.

Nitin Agrawal
fuente

Respuestas:

140

Necesitas usar GetHubContext:

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

Esto se describe con más detalle en http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub .

halter73
fuente
4
"context.Clients.All.Send" no se retransmite a la persona que llama, solo a los demás. ¿algunas ideas?
user384080
4
Si está utilizando, GetHubContextno hay ningún llamador, ya que está destinado a utilizarse fuera de un Hub. Clients.Alldebe dirigirse a todos los clientes que están actualmente conectados al Hub.
halter73
5
Tengo el mismo código, pero no se llamaría al método Send ni a ningún otro método.
nAviD
5
Esto no le brinda una instancia del concentrador, le brinda una instancia de IHubContext. No puede usar esto para llamar a métodos de concentrador.
George Mauer
4
Esto funcionó para mí con UN cambio: context.Clients.All.broadcastMessage("Admin", "stop the chat"); use broadcastMessage en lugar de Send.
Wheel Builder
4

Una pequeña actualización para aquellos que se pregunten dónde se GlobalHostha ido. SignalR ha sido completamente reescrito para .net core. Entonces, si está utilizando el paquete SignalR.Core ( Diferencia entre las versiones de SignalR ), obtiene una instancia del contexto del concentrador de SignalR al inyectarlo en su servicio:

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

Y en Startup.cs:

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

Microsoft docu está aquí: envíe mensajes de SignalR desde fuera del concentrador .

Maxim Zabolotskikh
fuente