2014-09-04 7 views
14

Sto utilizzando SignalR per implementare la chat in asp.net ma quando apro più schede della mia applicazione Web sto ricevendo "Waiting for Available Socket ...".In attesa di socket disponibili in ASP.NET utilizzando SignalR

Ho implementato tutte le impostazioni specificate su Performance Tuning SignalR ma il problema non viene risolto.

Come posso risolvere questo problema?

+1

Stai solo cercando di avviare la demo di base? O stai effettivamente cercando di mettere a punto una vera applicazione? – mason

+0

Dove hai preso il codice per questa applicazione di chat o l'hai scritto da zero da solo? –

+0

lo scrivo da zero e quando apro più di 5 schede vengono caricate le schede .... a meno che non chiudo le schede precedenti –

risposta

8

Come già indicato nei commenti, stai premendo il connection limit per hostname che viene applicato dal browser.

Le opzioni di base sono

  • singola pagina app che ha le schede nella sua interfaccia utente in modo che l'utente non deve utilizzare le schede del browser
  • condividere la connessione, in qualche modo, ad esempio, come discusso in this question
  • sottodomini separati
+0

Hoppner come posso implementare il concetto di sottodominio separato. Devo distribuire la mia classe hub su tutti i domini? o c'è qualche modo? Perché ho sottodomini cretae 5 e ho passato la connessione come $ .connection.hub.url = 'url sottodominio'; –

+0

è possibile distribuirlo per ogni posizione e connettere le istanze con un backplane; o forse è possibile usare semplicemente l'url riscrittura/routing personalizzato (non ho mai provato così ci potrebbero essere delle complicazioni) –

+0

puoi per favore fornirmi qualche idea di esempio di implementazione usando la riscrittura dell'URL perché ho provato a distribuire su più server ma la mia chat i messaggi non funzionano .. a causa dell'ID di connessione non comune per più hub –

1

Si potrebbe implementare un meccanismo di bloccaggio che consente solo una connessione per più schede.

  1. negozio il valore di questo blocco nella memoria locale
  2. impostarlo su True prima di aprire nuova connessione, rilasciarlo (impostato su false) prima di chiudere la connessione (potrebbe essere necessario reagire a window.beforeunload evento).
  3. creare un timer che periodicamente controlla il valore di questo blocco. (È necessario farlo perché l'utente potrebbe chiudere la scheda in cui risiede la connessione attiva) Apre una nuova connessione solo quando il valore di questo blocco è falso.
  4. trasmette il messaggio ricevuto dalla scheda attiva ad altri (schede passive). Memorizza il valore del messaggio nella memoria locale mentre le altre schede periodicamente ne verifica la presenza per nuovi valori. Le schede passive dovrebbero memorizzare il timestamp dell'ultimo messaggio rianimato e cercare solo i messaggi più recenti di questo timestamp.

Questa soluzione consente di gestire il limite massimo di connessioni parallele.

0

Dopo aver risolto questo problema, ho risolto questo problema utilizzando il concetto di sottodominio. Per questo ho creato più sottodomini che puntano al sito principale e ogni volta che ho specificato l'url di hub da un dominio diverso, così sono stato in grado di aprire circa 5 schede da ciascun dominio. E questo trucco sta funzionando bene per me.

0

Solution con la memoria locale è implementato in questo piccolo progetto:

https://github.com/slimjack/IWC-SignalR

ho provato nella mia richiesta e lo consiglio vivamente come ha funzionato per me. L'ho testato su chrome, firefox e IE e sono stato soddisfatto delle prestazioni.

ricordare che si dovrebbe includere IWC all.min.js, IWC-signalr.js e signalr-patch.js prima di un riferimento <script src="signalr/hubs"></script>.

È pronto per funzionare bene con jQuery 1.7 o superiore. Con piccole modifiche sono stato in grado di eseguirlo con la versione 1.6.4.

Problemi correlati