Estoy tratando de descargar los datos de un cliente a mi máquina local (programáticamente) y su servidor web es muy, muy lento, lo que está causando un tiempo de espera en mi WebClient
objeto.
Aquí está mi código:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
¿Hay alguna manera de establecer un tiempo de espera infinito en este objeto? O si no, ¿alguien puede ayudarme con un ejemplo en una forma alternativa de hacer esto?
La URL funciona bien en un navegador: solo tarda unos 3 minutos en mostrarse.
.TotalMilliseconds
y no.Milliseconds
!La primera solución no funcionó para mí, pero aquí hay un código que funcionó para mí.
fuente
Debe usarlo en
HttpWebRequest
lugar de hacerlo,WebClient
ya que no puede establecer el tiempo de esperaWebClient
sin extenderlo (aunque use elHttpWebRequest
). El uso de en suHttpWebRequest
lugar le permitirá establecer el tiempo de espera.fuente
"Do not use the HttpWebRequest constructor. Use the WebRequest.Create method to initialize new HttpWebRequest objects."
desde msdn.microsoft.com/en-us/library/… . Ver también stackoverflow.com/questions/400565/…Timeout
propiedad deHttpWebRequest
. Está en milisegundos.No se pudo hacer que el código w.Timeout funcionara cuando se desconectó el cable de red, simplemente no se estaba agotando el tiempo, se movió a usar HttpWebRequest y ahora hace el trabajo.
fuente
var wresp = await request.GetResponseAsync();
lugar de varwresp = (HttpWebResponse)request.GetResponse();
, obtendrá un tiempo de espera masivo nuevamentePara completar, aquí está la solución de kisp portada a VB (no se puede agregar código a un comentario)
fuente
Como dice Sohnee, usar
System.Net.HttpWebRequest
y establecer laTimeout
propiedad en lugar de usarSystem.Net.WebClient
.Sin embargo, no puede establecer un valor de tiempo de espera infinito (no es compatible e intentar hacerlo arrojará un
ArgumentOutOfRangeException
)Recomiendo primero realizar una solicitud HEAD HTTP y examinar el
Content-Length
valor del encabezado devuelto para determinar el número de bytes en el archivo que está descargando y luego configurar el valor de tiempo de espera correspondiente para laGET
solicitud posterior o simplemente especificar un valor de tiempo de espera muy largo Nunca esperes superarlo.fuente
fuente
Para cualquiera que necesite un WebClient con un tiempo de espera que funcione para métodos asincrónicos / de tareas , las soluciones sugeridas no funcionarán. Esto es lo que funciona:
Escribí en un blog sobre la solución completa aquí
fuente
Uso:
Clase:
Pero recomiendo una solución más moderna:
Lanzará un
OperationCanceledException
después de un tiempo de espera.fuente
En algunos casos es necesario agregar agente de usuario a los encabezados:
Esta fue la solución a mi caso.
Crédito:
http://genjurosdojo.blogspot.com/2012/10/the-remote-server-returned-error-504.html
fuente