2015-08-28 10 views
11

Sto lavorando con SignalR in un insieme molto specifico di condizioni di rete (un proxy pazzo). Quindi le prese non funzionano affatto e devo usare il polling lungo. Quando aggiorno una pagina sembra funzionare per un po ', ma poi si verifica la prima disconnessione. Sto cercando di riconnettersi automaticamente in caso scollegato e il seguente schema:Pattern di riconnessione strano Signal

  1. Dopo che la pagina viene caricata, si disconnette hub in circa 110 secondi (timeout predefinito)
  2. Ci vogliono 3 eventi disconnessi per riavviare un hub dopo la prima disconnessione (quindi si collega solo al 4 ° tentativo)
  3. Dopo di che si riconnette sempre al primo tentativo ma si disconnette dopo circa 10-15 secondi (non 110 secondi). Quindi sembra che il timeout keep-alive sia in qualche modo coinvolto qui (mentre non era al primo tentativo).

Questo comportamento sembra strano. C'è qualcosa che posso fare per migliorarlo?

+0

Può essere più preciso circa le vostre condizioni di rete? –

+0

@BrendanGreen, è una rete aziendale con qualche proxy (Webwasher) e un sacco di cose che vengono bloccate (è una rete aziendale tedesca, lo sai ...) – SiberianGuy

+0

@BrendanGreen, hai visto la pagina all'indirizzo http: // www .asp.net/signalr/overview/guide-to-the-api/gestione-connessione-durata-eventi? Il comportamento di connessione per SignalR è 'indefinito', è possibile osservare molti disconnessioni e riconnettersi in un breve lasso di tempo senza una ragione apparente. La pagina fornisce le linee guida su come modificare il comportamento, ad esempio impostando 'GlobalHost.Confectionation.ConnectionTimeout = TimeSpan.FromSeconds (110);' – gd73

risposta

2

Assumere i suggerimenti disponibili in Understanding and Handling Connection Lifetime Events in SignalR in cui è possibile utilizzare buone soluzioni per gestire la durata della connessione in base al problema di rete. Inoltre, nei problemi di SignalR ho trovato per te la seguente soluzione che funziona anche con il polling lungo.

È possibile impostare la proprietà KeepAlive sulla ConfigurationManager e SignalR invierà una cornice vuota dei dati (in base al trasporto) sull'intervallo specificato per mantenere la connessione attiva (vedi Allow host to specify keep alive times). L'attuale meccanismo di timeout rende i protocolli di streaming non differenti.

+0

Sembra che KeepAlive sia abilitato di default – SiberianGuy

+0

@Idsa Per i trasporti diversi da quelli lunghi polling, invia un pacchetto 'keepalive' ogni 10 secondi.Questo valore non deve essere più di 1/3 del valore 'DisconnectTimeout'. –

2

Utilizzare ConnectionStatusStream. Questo flusso OnNexts viene generato quando vengono generati gli eventi del proxy hub SignalR lato client. Quindi vediamo cose come Connecting, Connected, ConnectionSlow, Reconnecting, Reconnected, Closed, Uninitialized. Tutti hanno iniziato la vita come eventi sul proxy hub SignalR e sono stati convertiti in un flusso IObservable utilizzando una delle numerose fabbriche RX. In questo caso IObservable.FromEvent.

In ogni caso, ecco il ConnectivityStatusViewModel generale che utilizziamo per mostrare le informazioni nella barra di stato in basso dell'app.

consultare questo:

ConnectionStatusStream

+0

Ho controllato il codice. Anche se è una bella architettura (non ha mai funzionato con RX), non vedo come risolve il problema che ho descritto – SiberianGuy