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
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 .
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>();
Vous pouvez facilement utiliser un hub en suivant ces 2 étapes.
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.
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.