c# - System.Net.WebClient irrazonablemente lento
go vs c# performance (7)
Cuando uso el método System.Net.WebClient.DownloadData() obtengo un tiempo de respuesta irrazonablemente lento.
Cuando busco una url usando la clase WebClient en .NET, tarda unos 10 segundos en obtener una respuesta, mientras que mi buscador busca la misma página 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.
No (todavía) he intentado si otras formas de descargar datos en .NET me dan los mismos problemas, pero sospecho que puedo 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:
Intenté hacer exactamente lo mismo usando System.Net.HttpWebRequest
lugar, usando el siguiente método, y todas las solicitudes terminan 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 (antiguo) que utiliza System.Net.WebClient
requiere de 15 a 30 s por cada solicitud para finalizar:
public static string DownloadText(string url)
{
var client = new WebClient();
byte[] data = client.DownloadData(url);
return client.Encoding.GetString(data);
}
¿Qué navegador estás usando para probar?
Intenta usar la instalación predeterminada de IE. System.Net.WebClient usa la configuración local de IE, proxy, etc. ¿Tal vez eso ha sido destrozado?
Descargue Wireshark aquí http://www.wireshark.org/
Capture los paquetes de red y filtre los paquetes "http". Debería darte la respuesta de inmediato.
Es posible que WebClient sea lento en algunas estaciones de trabajo cuando la Configuración automática de proxy está activada en la configuración de IE (ficha Conexiones - Configuración de LAN).
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 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 desactivado, 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 detecten un uso atípico e inyecten deliberadamente un retraso para molestar a los rascadores.
Agarraría a Fiddler (un inspector web simple y gratuito) y vería los tiempos.
Otra alternativa (también gratuita) para Wireshark es Microsoft Network Monitor .
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 informa aquí:
https://superuser.com/questions/413750/why-is-downloading-over-usb-so-slow
Entonces, si este es su escenario, una solución alternativa es descargar primero al HDD y luego copiar los archivos al medio lento luego de que se complete la descarga.
Tuve ese problema con WebRequest. Intenta establecer Proxy = null;
WebClient wc = new WebClient();
wc.Proxy = null;
De forma predeterminada, WebClient, WebRequest intenta determinar qué proxy usar desde la configuración de IE, a veces da como resultado un retraso de 5 segundos antes de que se envíe la solicitud real.
Esto se aplica a todas las clases que usan WebRequest, incluidos los servicios WCF con enlace HTTP. En general, puede usar este código estático al inicio de la aplicación:
WebRequest.DefaultWebProxy = null;