web-dev-qa-db-fra.com

Comment utiliser l'instance de concentrateur SignalR en dehors de la ligne de moyeu

J'utilise SignalR pour diffuser des messages à tous mes clients. Je dois déclencher la diffusion en dehors de ma classe de concentrateur, c'est-à-dire quelque chose comme ci-dessous:

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

Je reçois un message d'erreur comme:

L'utilisation d'une instance Hub non créée par HubPipeline n'est pas prise en charge.

78
Nitin Agrawal

Vous devez utiliser GetHubContext:

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

Ceci est décrit plus en détail à http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub .

132
halter73

Une petite mise à jour pour ceux qui pourraient se demander où est passé le GlobalHost. SignalR a été complètement réécrit pour le noyau .net. Donc, si vous utilisez le package SignalR.Core ( Différence entre les versions de SignalR ), vous obtenez une instance du contexte du concentrateur SignalR en l'injectant dans votre service:

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

Et en Startup.cs:

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

Microsoft docu est ici: Envoyer des messages SignalR depuis l'extérieur du hub .

3
Maxim Zabolotskikh