73 votes

Appeler les clients du hub SignalR depuis un autre endroit du système

J'ai mis en place un hub SignalR pour communiquer entre le serveur et le client. Le code côté serveur du hub est stocké dans une classe appelée Hooking.cs. Ce que je veux, c'est être capable d'appeler une méthode définie dans Hooking.cs pour me permettre de diffuser des messages à tous les clients connectés depuis n'importe quel endroit de mon application. Il semble qu'une nouvelle instance de Hooking.cs soit créée pour chaque appel client/serveur, j'avais donc espéré pouvoir utiliser quelque chose comme

var hooking = new Hooking();
hooking.Test();

avec la méthode Test() définie dans Hooking.cs telle que

public static void Test() {
    Clients.test()
}

et avec un javascript côté client

var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()

Malheureusement, ce n'est pas aussi simple, car Clients n'est pas statique et n'est donc pas accessible depuis une méthode statique.

En parcourant le code source de SignalR, je suis tombé sur une méthode qui semblait prometteuse, Hubs.Invoke(string hubName, string method, params object[] args) donc j'espère pouvoir utiliser quelque chose comme Hubs.Invoke("Hooking", "Test") mais je n'arrive pas à le faire fonctionner.

Toute aide à ce sujet serait très appréciée.

0 votes

Mais peut-être pouvez-vous m'aider ;) Une idée sur la façon d'exécuter votre code js dans votre message de diffusion pour tous les autres clients, et non pour l'appelant d'origine qui a émis le message ? :)

0 votes

Malheureusement, je ne le fais pas. J'ai géré cela côté client, en renvoyant l'identifiant du client avec la réponse et en n'appelant pas la fonction si les identifiants correspondent.

111voto

Paolo Moretti Points 9519

C'est la manière correcte pour SignalR 2.x :

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);

En fait, vous pouvez utiliser le résolveur de dépendances pour l'hôte actuel afin de résoudre le fichier IConnectionManager qui vous permet d'obtenir l'objet contexte d'un hub.

Vous trouverez de plus amples informations dans le documentation officielle .

32voto

dfowler Points 16530

23voto

Greg Ennis Points 3316

Hub.GetClients a disparu dans la version 0.4.0.

De la wiki que vous pouvez maintenant utiliser :

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();

7 votes

Et n'oubliez pas d'ajouter using SignalR.Infrastructure;

6voto

Abrar Jahin Points 2097

Vous pouvez facilement utiliser un moyeu en suivant ces 2 étapes-

  1. Instanciation par injection de dépendance comme ceci-

    public class ClassName
    {
        ........
        ........
        private IHubContext _hub;
    
        public BulletinSenderController(IConnectionManager connectionManager)
        {
            _hub = connectionManager.GetHubContext<McpHub>();
            ........
            ........
        }
    
        ............
        ............
    }

2. l'utilisation de la hub comme ceci.

_hub.Clients.All.onBulletinSent(bulletinToSend);

Pour en savoir plus aquí .

Un exemple de code peut être trouvé dans ce dépôt git .

1voto

Ian Newson Points 2163

Cela a changé dans .NET Core 2, maintenant vous pouvez utiliser l'injection de dépendance comme ceci :

    private readonly IHubContext<MyHub,IMyHubInterface> _hubContext;

    public MyController(MyHub,IMyHubInterface hubContext)
    {
        _hubContext = hubContext;
    }

    public bool SendViaSignalR()
    {
        _hubContext.Clients.All.MyClientSideSignalRMethod(new MyModel());
        return true;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X