2011-08-30 15 views
20

Credo di capire le differenze pratiche tra HttpWebRequest.Timeout e HttpWebRequest.ReadWriteTimeout. Tuttavia, sto cercando ulteriore chiarezza sulla differenza tra questi due timeout, compreso cosa significano questi valori rispetto al sottostante TCP connessione/buffer/stato se applicabile.Timeout di HttpWebRequest e ReadWriteTimeout - Cosa significano questi per la connessione TCP sottostante?

Ad esempio, questi timeout vengono utilizzati solo durante l'inizializzazione della connessione TCP o sono solo questi i valori gestiti per tenere sotto controllo la connessione non gestita?

Quali sono gli scenari client-server in termini TCP in cui si applicano o non si applicano ciascuno di questi timeout?

risposta

13

Questo problema è stato discusso su un'altra domanda, vedere Adjusting HttpWebRequest Connection Timeout in C#. La discussione mi ha fatto girare la testa, quindi offrirò il mio riassunto.

Sebbene MSDN spieghi che lo HttpWebRequest.Timeout Property si applica alle chiamate HttpWebRequest.GetResponse e HttpWebRequest.GetRequestStream, la descrizione è un po 'confusa.

Jim Mischel è più utile: Timeout "è il tempo per il server di rispondere a una richiesta, non la quantità di tempo di attesa per il server per rispondere e inviare giù tutti i dati." Pertanto, Timeout copre la creazione di una connessione funzionante. Per i payload di grandi dimensioni, questo non implica che la richiesta/risposta sia completa.

ReadWriteTimeout si applica alle operazioni di lettura o scrittura sui flussi che trasmettono tramite la connessione. Per esempio. quando scrivi nello stream restituito da GetRequestStream. La connessione è già stabilita, ma c'è il rischio che si interrompa. Per esempio. la connessione di rete va giù.

Il collegamento Jim Mischel ha alcuni ottimi consigli su quali valori impostare questi timeout. Cioè l'impostazione predefinita per ReadWriteTimeout è troppo lunga.

+3

Un altro frammento di informazione: 'HttpWebRequest.ReadWriteTimeout' funziona impostando il alla base delle proprietà 'WriteTimeout' di' NetworkStream' e 'ReadTimeout' (apprese smontando' System.Net'). –

+0

Una cosa che vale la pena menzionare è che 'Timeout' racchiude' ReadWriteTimeout'. Se si dispone di 'Timeout' <' ReadWriteTimeout', la richiesta di lunga durata potrebbe ancora scadere. Ho frainteso che la prima volta ... – dstj

+0

@dstj valore predefinito di timeout = 100s mentre ReadWriteTimeout = 300s. Quindi, per impostazione predefinita, Timeout codewarrior

4

.Timeout = tempo speso cercando di stabilire una connessione (ad esclusione di tempo di ricerca) .ReadWriteTimeout = tempo trascorso cercando di leggere o scrivere i dati dopo la connessione stabilita

5

Credo che hai avuto la prima parte della risposta da @ Donal Lafferty. Ecco un breve riassunto comunque.

HttpWebRequest.Timeout - Il tempo prima del quale il server deve accettare la richiesta del cliente. Si noti che questo non include il tempo di risoluzione DNS, che è gestito da ServicePointManager.

HttpWebRequest.ReadWriteTimeout - Il tempo prima del quale il client deve ricevere l'intero corpo della risposta dal server. Si noti che questo timeout si avvia solo dopo che il server accetta la richiesta.

La risposta alla seconda domanda è duplice.

1. richiesta sincrona:

Il TCP connessioni sono chiusi il timeout, tutti felici.

2.Richiesta asincrona:

Questi timeout non hanno assolutamente alcun effetto. Se non si dispone di un meccanismo appropriato per la consegna dei timeout, le connessioni TCP rimarranno aperte.

è proprio questo il motivo per cui si interrompe la richiesta di registrazione di un timeout sul AsyncWaitHandle, come mostrato nell'esempio qui:

http://msdn.microsoft.com/library/21k58ta7.aspx

Problemi correlati