Pregunta

Estoy intentando cargar archivos a un servidor web usando System.Net.WebClient.UploadFile pero sigo recibiendo una WebException. Específicamente, recibo 3 errores. No tengo idea de por qué no obtengo el mismo error, pero todos parecen estar relacionados con lo que encontré en línea.

  • La solicitud fue cancelada: la solicitud fue cancelada.
  • Conexión cerrada. Inténtalo de nuevo.
  • Una conexión existente fue cerrada por la fuerza por el host remoto.

Parece algo aleatorio (no siempre el mismo archivo, cantidad de tiempo o cualquier otro patrón que pueda descubrir). Además, esto no sucede en mi red de trabajo (las cargas tardan menos de 2 segundos), pero sí desde casa a través de un DSL (las cargas tardan aproximadamente 2 minutos).

Por lo que he encontrado en línea, estos errores tienen algo que ver con keep-alives. Lamentablemente, WebClient no proporciona ninguna forma de desactivarlos (no estoy seguro de querer hacerlo de todos modos, ya que esta es una función de rendimiento).

Creo que podría tener algo que ver con los tiempos de espera, pero no puedo entender por qué. El servidor es ASP.Net MVC y el tiempo de espera se establece en una hora.

    <httpRuntime
        maxRequestLength="10024" 
        executionTimeout="3600"
        /><!-- 10024 = 10MB, 3600 = 1hr -->

Estoy interesado en ambas formas de solucionar este problema para que no suceda y también en las técnicas de recuperación (simplemente hacer que la solicitud nuevamente no parezca efectiva).

Algunos antecedentes, esto es para una aplicación WinForms que carga fotos al servidor. El servidor es una aplicación ASP.Net MVC. El cliente ha funcionado correctamente durante mucho tiempo, pero ahora está fallando desde que lo cambié a ASP.Net MVC (estaba usando ASP clásico con SA FileUp). El lado del cliente solo cambió para acomodar las nuevas URL, aparte de eso, es más o menos lo mismo.

¿Fue útil?

Solución

La excepción " La solicitud fue cancelada: la solicitud fue cancelada. " se lanza si el WebClient agota el tiempo de espera durante una transferencia de archivos. Si no se realiza ninguna transferencia de archivos, obtendrá "La operación ha expirado" en lugar.

El tiempo de espera está ocurriendo en el cliente. WebClient no le permite establecer el tiempo de espera y el valor predeterminado para HttpWebRequest (lo que utiliza WebClient) es de 100 segundos. Supongo que tendré que descubrir cómo obtener el progreso al usar HttpWebRequest. También tendré que descubrir por qué la transferencia de archivos ASP.Net es más lenta que usar SAFileUp con ASP clásico.

ACTUALIZACIÓN: he creado una clase WebHelper que toma el lugar de WebClient pero proporciona más acceso a las características necesarias de la WebRequest subyacente. También proporciona un montón de capacidades adicionales sobre el WebClient. Si está interesado, está disponible en el proyecto BizArk en CodePlex.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top