2013-03-21 12 views
15

ci siamo imbattuti in questo link, che specifica il tempo diverso out proprietà: https://github.com/SignalR/SignalR/wiki/Configuring-SignalRSignalR Proprietà Timeout

E anche questo ottimo post (When does a reconnect in signalR occour?) su come disconnessioni e riconnessioni avvengono tra un client e un server SignalR SignalR.

Giusto per ribadire le situazioni diverse dalla post di cui sopra:

"una riconnessione hub si verifica quando un client non è in linea poi riacquista connettività poco dopo i valori di configurazione SignalR determinano in gran parte i timestamp dei seguenti esempi così. non prendere i tempi di parola per parola

Ecco alcuni esempi e dei loro risultati (formato dell'ora m: ss). coinvolgono comportamento ricollegando:

Situazione 1

00:00 - client si connette al server, OnConnected viene attivato

0:10 - client perde la connessione a causa di problemi ISP (e si rende conto che perde la connessione)

00:15 - Cliente riaquista connettività

00:16 - OnReconnected evento viene attivato

Situazione 2

0:00 - client si connette al server, OnConn ette è innescato

0:10 - client perde la connessione a causa di tirare il cavo ethernet (non si accorge che è scollegato)

00:15 - Cliente riaquista connettività

Due cose possono accadere qui

A: 0:16 - Non succede nulla e cliente prosegue con la sua connessione precedente

B: 0: ~ 45 - cliente realizza la sua scollegato *

B: 0:46 - Transizioni client nello stato di riconnessione

B: 0:47 - Il client si riconnette correttamente e viene attivato l'evento OnReconnected.

Situazione 3

0:00 - client si connette al server, OnConnected viene attivato

0:10 - client perde la connessione a causa di tirare il cavo ethernet (non se ne accorge è scollegato)

0: ~ 45 - Cliente realizza la sua *

0:46 sconnessi - transizioni client nello stato di ricollegare

1:15 - Il server determina che il client è stato rimosso per troppo tempo e quindi si dimentica di esso, accodando un comando di "disconnessione" affinché il client possa ricevere se si riconnette poco dopo. ***

1:15 - OnDisconnect è innescato 01:16 - Cliente riacquista connettività

1:17 - client fa un "soft" ricollegare (non si innesca OnReconnected)

1:18 - client recupera il comando "disconnect"

1:19 - client chiama "Stop" e fa una disconnessione morbido (non attiva OnDisconnected)

Situazione 4

012.

0:00 - client si connette al server, OnConnected viene attivato

0:10 - client perde la connessione a causa di tirare il cavo ethernet (non se ne accorge è scollegato)

0: ~ 45 - Cliente è consapevole le sue scollegati *

0:46 - transizioni client nello stato riconnessione

1:15 - Server determina che il cliente è stato andato per troppo tempo e poi dimentica a questo proposito, in coda un comando "disconnect" per il cliente per ricevere se si ricollega lievi y dopo. ***

1:15 - OnDisconnect viene attivato 01:30 - client interrompe che tenta di riconnettere (cercato troppo lungo) **

1:30 - transizioni client in stato disconnesso

  • A causa del controllo keep alive del client: utilizzato per determinare quando un client è offline a causa della mancanza di keep alive. Non utilizzato per il lungo trasporto polling

** A causa client timeout lato disconnessione: usato per determinare quando un cliente è stato ricollegando per troppo tempo di un periodo e le probabilità sono il server ha dimenticato il cliente durante il tempo

*** A causa del timeout di disconnessione del server: utilizzato per determinare quando un client deve essere dimenticato. È un intervallo di tempo che inizia ad accumularsi una volta che una connessione viene contrassegnata come morta sul server. Alla fine il server mette in coda un comando di disconnessione per l'argomento del client che dice al client (se si ricollega) che deve avviare una nuova connessione. Il comando sparirà dal server quando l'argomento viene ripulito."


Quello che stiamo trovando è che otteniamo si disconnette e riconnette molto spesso (1 e 2) tra un client .NET SignalR e un server ASP.NET MVC SignalR, e disconnette anche che non comportano . riconnessioni (3 e 4) sappiamo che il protocollo ServerSentEvents viene utilizzato

e 'difficile sapere quali sono le proprietà di timeout abbiamo bisogno di modificare (aumento o diminuzione) a:.

  1. Ridurre il numero di disconnette e ricollega
  2. Non finire affatto nelle situazioni 3 e 4.

Una cosa importante da notare qui è che il nostro .NET SignalR Client è in realtà un servizio di Windows che è collegato al server tutto il tempo.

Attualmente abbiamo appena tenuto le impostazioni predefinite, che sono:

  • ConnectionTimeout = 110 secondi
  • DisconnectTimeout = 30 secondi
  • KeepAlive = 30 secondi

Inoltre, stiamo utilizzando SignalR 1.0.1.

risposta

6

I tuoi timeout sono impostati correttamente. Nella versione attuale non c'è nessun client che si mantenga attivo per il client .net per garantire che il client mantenga la connettività.

Nella prossima versione si avrà un lato client .net keep alive. Se sei disposto a lavorare con una versione di sviluppo del progetto, la funzione è attualmente disponibile sul ramo dev https://github.com/SignalR/SignalR/tree/dev.

Anche per riferimento, ecco il problema relativo a ciò che stai vedendo https://github.com/SignalR/SignalR/issues/741.

+1

Grazie.Questo ci dà qualcosa su cui lavorare. PS. vorrei votare ma non ho abbastanza punti Rep apparentemente :-(Segnalo come risposta non appena ho confermato che il client Keep Alive ci aiuta con le disconnessioni – smitra

+0

Haha tutto bene solo felice che aiuti =) –

+0

Ciao di nuovo, non sono riuscito a trovare il lato client .NET KeepAlive nel ramo dev. Non sembra essere una proprietà sulla classe Connection. Il più vicino che ho trovato era il KeepAliveData con una proprietà di timeout sull'interfaccia di IConnection. Presumo che questo è ciò a cui ci stiamo riferendo? – smitra

4

Si sta utilizzando SignalR 1.0.1? La descrizione di Taylor del processo di riconnessione si applica a SignalR versione> = 1.0 e al client JS. Il motivo per cui lo chiedo è che in SignalR> = 1.0, KeepAlive non deve essere più di un terzo di DisconnectTimeout. Il KeepAlive e il DisconnectTimeout assolutamente non possono essere uguali.

Tuttavia, se 1.0. * Si imposta DisconnectTimeout dopo KeepAlive, il keep-alive sarà impostato su un terzo di DisconnectTimeout. Nel tuo caso, questo sarebbe il default di 10 secondi.

Un sacco di problemi sono stati risolti in SignalR 1.0, quindi è sicuramente la pena di aggiornamento se non lo hai. Sebbene, come hanno sottolineato altre risposte, il client .NET non supporterà i controlli keep-alive e non riconoscerà che il cavo di rete è stato scollegato fino a 1.1

P.S. È sempre possibile riavviare manualmente il tuo Connection se ti rendi conto in qualche modo che si disconnette. In questo scenario, l'ID di connessione cambierà naturalmente.

+0

Ciao, grazie per la spiegazione. Mi dispiace avrei dovuto dire che siamo sulla versione 1.0.1. La domanda originale è stata ora aggiornata. – smitra

+0

Il lato client rimane attivo per il client .net non è ancora disponibile in 1.0.1 per essere chiari. –

7

Il client .NET NON ha ancora questo comportamento. e non si ricollegherà se il client interrompe improvvisamente una connessione. Lo farà nel 1.1.

+12

Sono confuso sul motivo per cui le persone hanno votato questa risposta, specialmente perché dfowler in realtà ha scritto il framework su cui si basa questa domanda ... –

+3

@david non riesce a trovare questa funzionalità in 2.2, qualsiasi aggiornamento? – Krazibit312