2010-03-04 5 views
5

Estoy haciendo una solicitud web que es demasiado lenta. Se necesitan alrededor de 3.2 segundos para GetResponseStream() y .8 segundos para ReadToEnd()Las solicitudes web son lentas (demoran 4 segundos) ¿Cómo las agilizo?

Si ejecuto la misma solicitud en un navegador web, recibo una respuesta en menos de un segundo ... Me pregunto qué puedo hacer para acelerar la solicitud y lo que podría causar que sea lento?

Basado en otras preguntas que vi aquí, desactivé el proxy en app.config + conexiones máximas habilitadas, por si acaso (todavía es lento). La sección añadí fue:

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

Aquí hay una captura de pantalla de lo que el código es similar y lo que es lento:

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

lo agradecería cualquier ayuda ... 4 -8 segundos es demasiado tiempo para que un usuario espere a que se complete una solicitud de Ajax.

Gracias!

+0

(No cambiará el tiempo de respuesta, pero ¿por qué estás volviendo a lanzar lo que acabas de atrapar en la excepción?) –

+0

¿Estás seguro de que el navegador no está simplemente en el caché? Aún así, pregunta interesante! –

+0

Bueno, este método es de una biblioteca y no cambié esa parte porque se registraron los errores lanzados. – rksprst

Respuesta

3

La línea

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

hace 3 cosas a la vez:

  1. Se pone la respuesta de los datos.
  2. Obtiene la secuencia de respuesta del objeto WebResponse.
  3. Abre la secuencia.

Para mejorar el análisis de tiempos, y por lo tanto comprender dónde está el cuello de botella, primero debe recodificar la sección para separar las tareas.

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

En el bloque finally sólo hay que cerrar el lector, ya que esto también cierra la secuencia subyacente. En lugar de cerrar explícitamente la transmisión, podría considerar usar un bloque using para el lector.

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

Sé que esto no es una solución, pero tal vez proporciona un poco más de información sobre dónde se pierde el tiempo.

Una última sugerencia, considere usar la ejecución asincrónica para reducir la duración de la ejecución tal como la percibe el usuario.

+0

+1 para usar 'using' – Nicolas78

Cuestiones relacionadas