Problemas al subir ficheros a una aplicación ASP.NET

Cuando subimos ficheros a una aplicación ASP.NET, dependiendo del tamaño del fichero y la velocidad de la conexión del cliente, ocasionalmente la subida del fichero puede fallar con el mensaje de error en el cliente de Internet Explorer no puede mostrar la página web, o con alguna de las siguientes excepciones (dependiendo de cómo esté configurado IIS, habitualmente este detalle de la excepción únicamente lo podremos ver en el log de eventos NT del servidor):

HttpException: Request timed out.

HttpException: Maximum request length exceeded.

 

En estos casos, los parámetros que debéis configurar adecuadamente considerando el tamaño el tiempo de transmisión del fichero son los siguientes:

 

<httpRuntime executionTimeout="600" maxRequestLength="61440" />

El parámetro de executionTimeout determina el tiempo en segundos que puede ejecutarse una páginas ASP.NET antes de que se lanza una excepción de time out. Por otro lado, el parámetro maxRequestLength determina el tamaño total máximo en bytes de las peticiones HTTP. Debemos configurar estas secciones acorde con los tiempos máximos de carga y tamaños máximos de fichero que queremos que soporte nuestra aplicación.

 

Los parámetros de la sección <httpRuntime> se pueden configurar a nivel de web.config de aplicación, e incluso a nivel de una página específica de la siguiente manera:

 

<?xml version="1.0"?>

<configuration>

...

  <location path="Default.aspx">

    <!--

      Aquí la configuración específica

      para la página Default.aspx del

      directorio virtual al que aplica

      este web.config.

    -->

    <system.web>

      <httpRuntime

        executionTimeout="600"

        maxRequestLength="61440" />

    </system.web>

  </location>

 

</configuration>

Esto último es recomendable, dado que aumentar el executionTimeout de todas las páginas de una aplicación puede tener consecuencias negativas. En general, los timeout se deben mantener con valores razonablemente bajos, precisamente para que cuando se produzca una situación de bloqueo, se lanze la excepción y se finalice el procesamiento de la página en poco tiempo de forma que se libere el thread y se puedan atender otras peticiones. Con timeouts elevados se podrían llegar a agotar todos los threads en situaciones de bloqueo, por tardar demasiado en ser liberados.

 

Por último, si una vez habiendo configurado nuestra aplicación con valores adecaudos, la carga de ficheros sigue fallando con errores HTTP 400 en los logs de IIS y errores de Timer_EntityBody en los logs de HTTP.sys (HTTPERR), probad a desinstalar la funcionalidad de SNP (Scalable Networking Pack) en el servidor web siguiente los instrucciones del siguiente artículo:

An update to turn off default SNP features is available for Windows Server 2003-based and Small Business Server 2003-based computers

https://support.microsoft.com/default.aspx?scid=kb;EN-US;948496

Estos cambios requieren reincio del sistema operativo para entrar en vigor.

Espero que os haya sido de utilidad.

- Daniel Mossberg