2013-03-18 14 views
13

Ho più servizi SignalR in esecuzione e solo un'interfaccia utente per accedervi.Client SignalR con più connessioni

Come posso fare in modo che il client js comunichi con più connessioni con URL diversi? Perché sembra che posso specificare solo un URL per $ .connection.hub e non posso usare più script client "signalr/hubs".

Qualsiasi aiuto? Grazie.

risposta

23

$ .connection.hub viene creato nell'inclusione/signalr/hubs.

Alla fine del file lo fa essenzialmente:

$.connection.hub = $.hubConnection("/signalr", { useDefaultPath: false }); 

Per creare il proxy hub si fa:

var myHub = $.connection.hub.createHubProxy('myHub'); 

Semplice esempio per connessioni multiple:

var connection1 = $.hubConnection("http://www.myfirstendpoint.com"); 
var connection2 = $.hubConnection("http://www.mysecondendpoint.com"); 

var myCon1Hub = connection1.createHubProxy('myCon1Hub'); 
var myCon2Hub = connection2.createHubProxy('myCon2Hub'); 

myCon1Hub.client.foo = function() { ... Whatever you want ... }; 
myCon2Hub.client.foo = function() { ... Whatever you want ... }; 

connection1.start(); 
connection2.start(); 
+0

Grazie. Funziona. – Adamy

+2

Attenzione che i browser hanno un numero limitato di connessioni simultanee per dominio. Quindi se apri alcune schede la tua pagina potrebbe smettere di caricarsi. – davidfowl

+0

https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs-%28No-Proxy%29 fornisce più documentazione sulla creazione del proprio 'hubConnection's – halter73

6

mio soluzione per tali occasioni:

var SignalRHelpers = function() { 
    var _connectionDeferred; 

    var subscribeToConnectionStart = function (callback) { 
    if (!_connectionDeferred) // start connection if not yet initialized 
     _connectionDeferred = $.connection.hub.start(); 

    if ($.connection.hub.state == $.connection.connectionState.connected && callback) { 
     // already connected 
     callback(); 
    } else if (callback) { 
     // register handler 
     _connectionDeferred.done(callback); 
    } 
    }; 

    return { 
    SubscribeToConnectionStart: subscribeToConnectionStart 
    }; 
}(); 

Memorizza internamente l'oggetto promessa da start() e allega i gestori secondo necessità.

Fondamentalmente si chiama SignalRHelpers.SubscribeToConnectionStart ogni volta che è necessario connettersi. Ad esempio

SignalRHelpers.SubscribeToConnectionStart(function(){ 
    someHub.server.executeSomething(); 
}); 
+0

Questo ha risolto un problema molto mistico che avevo nella mia SPA, dove dovevo aggiornare la pagina affinché SignalR funzionasse mentre ero in visualizzazione con SignalR, semplicemente non funzionava se Ho navigato su di esso, ma usando SubscribeToConnectionStart invece di semplice $ .connection.hub.start() –

Problemi correlati