2011-10-03 18 views
68

Ho configurato un hub SignalR per comunicare tra il server e il client. Il codice lato server hub è memorizzato in una classe chiamata Hooking.cs. Quello che voglio è poter chiamare un metodo definito in Hooking.cs per permettermi di trasmettere messaggi a qualsiasi client connesso da qualsiasi punto della mia applicazione. Sembra che una nuova istanza di Hooking.cs viene creato per ogni chiamata client/server, quindi mi aveva sperato che sarei stato in grado di usare qualcosa comeChiamare client hub SignalR da qualsiasi altra parte nel sistema

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

con il Metodo() definita in Hooking.cs come ad esempio

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

e con un lato client JavaScript

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

Purtroppo non è che semplice, poiché i client non sono statici, quindi non accessibili da un metodo statico.

Guardando attraverso il codice sorgente SignalR mi sono imbattuto in un metodo che sembrava promettente, Hubs.Invoke(string hubName, string method, params object[] args), quindi spero di poter usare qualcosa come Hubs.Invoke("Hooking", "Test") ma non riesco a farlo funzionare.

Qualsiasi aiuto con questo sarebbe enormemente apprezzato

+0

Ma forse puoi aiutarmi;) Qualche idea su come eseguire il tuo codice js nel messaggio broadcast per tutti gli altri client, e non il chiamante che ha emesso il messaggio? :) – GONeale

+0

Purtroppo no. Ho gestito questo lato client, restituendo l'ID client con la risposta e semplicemente non richiamando la funzione se la corrispondenza dell'ID –

risposta

1

Avere uno sguardo a come si fa in Chat.cs in SignalR.Samples.Hubs.Chat da https://github.com/SignalR/SignalR.

posso vedere in là che statici Dictionary<TKey, TValue> 's vengono istanziati in alto, quindi immagino che siano mantenute costantemente troppo, sia con la classe Chat essere un'istanza persistente (?) O tale matrice viene aggiornata in qualche modo.

Dai un'occhiata, David Fowler sarebbe probabilmente il migliore in questo.

+0

Sì, sto utilizzando gli esempi SignalR per provare a risolverlo. I dizionari sono statici, quindi le informazioni persistono su più istanze della classe, ecco perché speravo di poter semplicemente creare un'istanza di Hooking.cs e usarla, ma non funziona –

23

Hub.GetClients è scomparso nella versione 0.4.0.

Dal wiki ora è possibile utilizzare:

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

E non dimenticare di aggiungere 'usando SignalR.Infrastructure;' – nmat

101

questo è il modo corretto per SignalR 2.x:

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

In sostanza, è possibile utilizzare il risolutore di dipendenza per la corrente host risolvere l'interfaccia IConnectionManager che consente di ottenere l'oggetto contesto per un hub.

Ulteriori informazioni sono disponibili nello official documentation.

5

si può facilmente utilizzare un hubseguendo questo passo- 2

  1. istanziare per l'iniezione di dipendenza come questo-

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

2.Utilizzando l'oggetto hub come questo-

_hub.Clients.All.onBulletinSent(bulletinToSend); 

più può essere trovato here.

Codice di esempio può essere trovato in this git repo.

Problemi correlati