2010-12-11 10 views
34

Al utilizar el método System.Net.WebClient.DownloadData() Recibo un tiempo de respuesta excesivamente lento.System.Net.WebClient injustificadamente lento

Cuando ir a buscar una dirección URL utilizando la clase de cliente Web en .NET se tarda alrededor de 10 segundos antes de que consiga una respuesta, mientras que la misma página se trae por mi navegador en menos de 1 segundo. Y esto es con datos de 0.5kB o más pequeños.

La solicitud implica parámetros POST/GET y un encabezado de agente de usuario si tal vez eso podría causar problemas.

que (todavía) no han tratado si otras formas de descargar los datos en .NET me da los mismos problemas, pero estoy sospechando que podría obtener resultados similares. (Siempre tuve la sensación de que las solicitudes web en .NET son inusualmente lentas ...)

¿Cuál podría ser la causa de esto?

Editar:
He intentado hacer la cosa correcta usando System.Net.HttpWebRequest lugar, utilizando el método siguiente, y todas las solicitudes de terminar en menos de 1 segundo.

public static string DownloadText(string url) 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     var response = (HttpWebResponse)request.GetResponse(); 

     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      return reader.ReadToEnd(); 
     } 
} 


Si bien este método (de edad) usando System.Net.WebClient toma 15-30s para cada solicitud a fin:

public static string DownloadText(string url) 
{ 
     var client = new WebClient(); 
     byte[] data = client.DownloadData(url); 
     return client.Encoding.GetString(data); 
} 
+0

Relacionado: http://stackoverflow.com/questions/4932541 –

Respuesta

2

Descargar Wireshark aquí http://www.wireshark.org/

capturar los paquetes de red y filtrar el "http "paquetes" Debería darle la respuesta de inmediato.

+1

Nada extraño aparece en wireshark, pero con trazas de huellas puedo ver que se llama a WebClient.DownloadData(), y la solicitud GET no aparece en wireshark hasta alrededor de 10 -30 s después (dependiendo del tiempo de "congelación"). Parece que lo que está ralentizándolo no es la solicitud en sí, sino algo hecho antes de la solicitud GET real. – moevi

+1

Parece que su cliente estaba esperando el tiempo de espera de algo. La mayoría de las veces, está esperando el tiempo de espera de DNS o el tiempo de espera de NetBIOS. Puede intentar filtrar el paquete DNS y los paquetes NetBIOS. Alternativamente, puede intentar filtrar por la dirección IP de origen. Esto debería indicarle cuál es el último paquete enviado por su cliente antes de obtener el GET. Quizás, @Broken Pipe tiene razón. Puede estar esperando el Proxy. –

0

No hay nada intrínsecamente lento sobre las solicitudes web .NET; ese código debería estar bien. Regularmente uso WebClient y funciona muy rápido.

¿Qué tan grande es la carga útil en cada dirección? Pregunta tonta tal vez, pero ¿se trata simplemente de limitaciones de ancho de banda?

IMO lo más probable es que su sitio web se haya desconectado, y cuando acceda a la URL, el sitio web tarda en responder. Esto no es culpa del cliente. También es posible que DNS sea lento por algún motivo (en cuyo caso puede codificar la IP en su archivo "hosts"), o que algún servidor proxy en el medio es lento.

Si el sitio web no es suyo, también es posible que detecte un uso atípico e inyecte deliberadamente un retraso para molestar a los rascadores.

Me gustaría coger Fiddler (un inspector web simple y gratuito) y mirar los tiempos.

0

¿Qué navegador estás usando para probar?

Intente utilizar la instalación predeterminada de IE. System.Net.WebClient usa la configuración local de IE, proxy, etc. ¿Tal vez eso ha sido destrozado?

73

Tuve ese problema con WebRequest.Intenta establecer Proxy = null;

WebClient wc = new WebClient(); 
    wc.Proxy = null; 

Por cliente Web predeterminado, WebRequest tratar de determinar qué proxy para usar de configuración de Internet Explorer, a veces el resultado es como el retraso de 5 segundos antes de que la solicitud real se envía.

Esto se aplica a todas las clases que usan WebRequest, incluidos los servicios WCF con enlace HTTP. En general puede utilizar este código estático en el inicio de la aplicación:

WebRequest.DefaultWebProxy = null; 
+2

Recibí un * enorme * aumento de velocidad cuando hice esto. ¡Gracias! – mpen

+1

¡El segundo hizo una gran diferencia en mi caso! Esta es definitivamente la "característica" de desaceleración de estos WebProxies. –

+0

¡Tuve el mismo problema y esto realmente está mejorando el tiempo de respuesta! – gigi

0

cliente Web puede ser lento en algunas estaciones de trabajo cuando la configuración automática de proxy en registramos en la configuración de Internet Explorer (ficha Conexiones - Configuración de LAN).

0

Otra causa de descargas WebClient extremadamente lentas es el medio de destino al que está descargando. Si se trata de un dispositivo lento como una llave USB, esto puede afectar enormemente la velocidad de descarga. Para mi HDD pude descargar a 6MB/s, a mi llave USB, solo 700kb/s, aunque puedo copiar archivos a este USB a 5MB/s desde otra unidad. wget muestra el mismo comportamiento. Esto también se informó aquí:

https://superuser.com/questions/413750/why-is-downloading-over-usb-so-slow

Así que si este es su caso, una solución alternativa es descargar al disco duro primero y luego copiar los archivos en el medio lento después de la descarga completa.