web-dev-qa-db-fra.com

Appel des clients du hub SignalR depuis un autre endroit du système

J'ai configuré un hub SignalR pour la communication entre le serveur et le client. Le code côté serveur concentrateur est stocké dans une classe appelée Hooking.cs. Ce que je veux, c'est pouvoir appeler une méthode définie dans Hooking.cs pour me permettre de diffuser des messages à n'importe quel client connecté à partir de n'importe où dans mon application. Il semble qu'une nouvelle instance de Hooking.cs soit créée pour chaque appel client/serveur. J'espérais donc 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 si 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 prometteuse, Hubs.Invoke(string hubName, string method, params object[] args). J'espérais donc pouvoir utiliser un outil tel que Hubs.Invoke("Hooking", "Test"), mais je n'y parviens pas.

Toute aide à ce sujet serait grandement appréciée

71
Jordan Wallwork

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

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

Fondamentalement, vous pouvez utiliser le résolveur de dépendances pour l'hôte actuel pour résoudre l'interface IConnectionManager qui vous permet d'obtenir un objet de contexte pour un concentrateur.

Des informations complémentaires peuvent être trouvées dans le documentation officielle .

109
Paolo Moretti

Hub.GetClients a disparu de la version 0.4.0.

Depuis le wiki , vous pouvez maintenant utiliser:

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

Vous pouvez facilement utiliser un hub en suivant ces 2 étapes.

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

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

2.Utiliser l'objet hub comme ceci-

_hub.Clients.All.onBulletinSent(bulletinToSend);

Plus peut être trouvé ici.

Vous pouvez trouver un exemple de code dans ce dépôt Git.

6
Abrar Jahin

Regardez comment ça se passe dans Chat.cs dans SignalR.Samples.Hubs.Chat de https://github.com/SignalR/SignalR .

Je peux voir ici que statique Dictionary<TKey, TValue> sont instanciés en haut, alors j'imagine qu'ils sont également maintenus de manière persistante, la classe Chat étant une instance persistante (?) ou ce tableau étant mis à jour de façon ou d'autre.

Regardez, David Fowler serait probablement le meilleur sur ce point.

1
GONeale