2010-03-04 9 views
5

Sto facendo una richiesta web troppo lenta. Ci vogliono circa 3,2 secondi per GetResponseStream() e .8 secondi per ReadToEnd()WebRequests sono lenti (impiegano 4 secondi) come posso velocizzarli?

Se eseguo la stessa richiesta in un browser web ottengo una risposta in meno di un secondo ... Mi chiedo cosa posso fare fare per accelerare la richiesta e cosa potrebbe causare essere lento?

Sulla base di altre domande che ho visto qui, ho disabilitato il proxy in app.config + connessioni abilitate, nel caso (è ancora lento). La sezione ho aggiunto era:

<system.net> 
<defaultProxy enabled="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
</defaultProxy> 
<connectionManagement> 
    <add address="*" maxconnection="65000" /> 
</connectionManagement> 

Ecco uno screenshot di ciò che il codice è simile e ciò che è lento:

alt text http://i45.tinypic.com/2uy1xc4.jpg

Apprezzerei tutto l'aiuto ... 4 -8 secondi è troppo lungo perché un utente attenda il completamento di una richiesta Ajax.

Grazie!

+0

(Non che cambierà il tempo di risposta, ma perché stai rilanciando quello che hai appena rilevato nell'eccezione?) –

+0

Sei sicuro che il browser non lo stia solo memorizzando nella cache? Ancora, domanda interessante! –

+0

Bene, questo metodo proviene da una libreria e non ho modificato quella parte perché gli errori lanciati vengono registrati. – rksprst

risposta

3

La linea

responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream()); 

fa 3 cose in una volta:

  1. Si ottiene la risposta dai dati.
  2. Ottiene il flusso di risposta dall'oggetto WebResponse.
  3. Apre lo stream.

Per migliorare l'analisi dei tempi e quindi capire dove si trova il collo di bottiglia, è necessario prima ricodificare la sezione per separare le attività.

HttpWebResponse response = WebRequest.GetResponse(); 
Stream s = response.GetResponseStream(); 
reader = new StreamReader(s); 

Nel blocco finally è sufficiente chiudere il lettore, in quanto questo chiude anche il flusso sottostante. Invece di chiudere esplicitamente lo stream, potresti considerare l'utilizzo di un blocco using per il lettore.

using (Stream s = response.GetResponseStream()) { 
    StreamReader reader = new StreamReader(s); 
    responseData = reader.ReadToEnd(); 
} 

So che questa non è una soluzione, ma forse fornisce un po 'più di informazioni su dove il tempo è perso.

Un suggerimento finale, considerare l'utilizzo di esecuzione asincrona per ridurre la durata dell'esecuzione come percepito dall'utente.

+0

+1 per usare 'using' – Nicolas78

Problemi correlati