2009-09-13 11 views
5

Ho un codice abbastanza semplice che carica una foto o un video su un endpoint (usando HTTP PUT o POST). Ogni tanto vedo connessioni chiuse eccezioni generate, e in realtà la foto/video è stata caricata correttamente, chiama GetResponse dove si verifica l'eccezione.Perché il blocco GetResponse di HttpWebRequest è così lungo?

Una cosa che ho notato è che GetResponse può impiegare molto tempo per elaborare. Spesso più lungo del tempo di caricamento effettivo della foto sul server. Il mio codice scrive sul server web usando RequestStream.Write.

Ho eseguito un piccolo test e caricato sul server circa 40 foto/video di dimensioni variabili da 1 MB a 85 MB e il tempo di ritorno di GetResponse era compreso tra 3 e 40 secondi.

La mia domanda è, è normale? È solo questione di quanto tempo impiegherò il server per il quale sto caricando questi file per elaborare la mia richiesta e rispondere? Guardando le tracce HTTP di Fidder sembra essere il caso.

FYI, i miei arrivi sono HTTP 1.0, valori di timeout impostati Infinite (sia Timeout e ReadWriteTimeout)

+1

Omar: Se si fa clic su una sessione di Fiddler e scegli "Proprietà", è possibile visualizzare la collezione Timer per quella sessione.Due valori interessanti sono "ServerGotRequest" e "ServerBeginResponse". Qual è il delta tra quelli? – EricLaw

risposta

6

Se il server è genuinamente richiedere molto tempo per restituire qualsiasi dato (come mostrato in Fiddler), quindi questa è la causa di esso. Il caricamento di un allegato da 85 MB richiede molto tempo per iniziare e quindi il server deve elaborarlo. Non si può fare molto a riguardo, se non quello di utilizzare un metodo asincrono se si riesce a fare più lavoro prima che la chiamata ritorni.

Non del tutto chiaro che cosa di Fiddler che vi mostra anche se - è vero mostrando un lungo periodo di tempo prima che il server invia la risposta? Se è così, non c'è molto che tu possa fare. Sono sorpreso che la connessione venga chiusa su di te, ammettiamolo. Se, tuttavia, non vedi i tuoi dati essere scritto sul server per un po ', è diverso.

Si sta smaltendo la risposta restituita? In caso contrario, potresti avere connessioni che vengono mantenute in vita. Questo non dovrebbe essere un problema se è esplicitamente HTTP 1.0, ma è la causa più comune di chiamate Web "sospese" nella mia esperienza.

Fondamentalmente, se non si dispone di uno WebResponse, di solito (almeno con HTTP 1.1 e keepalive) rimane in attesa sulla connessione. C'è un limite al numero di connessioni che possono essere aperte a un singolo host, quindi potresti finire per aspettare fino a quando una precedente risposta è finalizzata prima che il prossimo possa procedere.

Se questo è il problema, un semplice using affermazione è la risposta:

using (WebResponse response = request.GetResponse()) 
{ 
    ... 
} 
+0

Sì, sto usando il metodo using sulla risposta e sto leggendo GetResponseStream. In questo caso sembra che devo solo convivere con il fatto che ci vorrà molto tempo ... –

0

Sì, il tempo di risposta può essere molto più lungo di appena il tempo di caricamento. Dopo che la richiesta è stata inviata al server, deve essere elaborata e deve essere restituita una risposta. Potrebbe esserci un po 'di tempo prima che la richiesta venga elaborata, e in genere il file verrà salvato da qualche parte. Dopodiché il server creerà la pagina di risposta che verrà restituita.

IIS gestisce solo una richiesta alla volta da ciascun utente, quindi se si avvia un altro caricamento prima del completamento del primo, esso aspetterà fino al completamento del primo prima che inizi a elaborare il successivo.

+1

<< IIS gestisce solo una richiesta alla volta da ciascun utente >> è assolutamente falso. Presumo che tu stia confondendo IIS con l'oggetto ASP "Session", che conteneva un mutex che poteva risultare nel limitare il numero di pagine eseguite simultaneamente per utente. – EricLaw

+0

@EricLaw: non conosco esattamente quale parte del server web limita il motore a una pagina per utente, ma trattandosi di una domanda .NET stiamo parlando di richieste che passano attraverso il motore ASP.NET. È assolutamente vero che il server gestirà solo una richiesta alla volta da ciascun utente. – Guffa