Mostrar página de error personalizado cuando la carga de archivos excede el tamaño permitido en ASP.NET MVC

Mi problema principal es que quiero mostrar una página de error personalizada cuando un archivo subido excede el tamaño permitido (maxRequestLength en web.config).

Cuando se carga el archivo grande, se lanza una HttpException antes de invocar el método de acción de carga en el controlador. Esto es esperado.

Intenté capturar la excepción en un atributo personalizado y también anular OnException en el controlador. ¿Por qué no es posible detectar la excepción en el atributo o en el método OnException?

Aunque es posible detectar la excepción en Application_Error en global.asax, ni Response.Redirect ni Server.Transfer funcionan para redireccionar a la página de error personalizada. Server.Transfer da el error “failed to process child request” y response.redirect da el error “Http headers already sent”.

¿Algunas ideas?

¡Gracias por adelantado!

Marcus

Cuando se ejecuta bajo IIS7 y hacia arriba hay otro parámetro:

       

La configuración predeterminada es ligeramente inferior a 30 MB.

Para archivos cargados con tamaño entre maxRequestLength y maxAllowedContentLength IIS7 arrojará una HttpException con el código HTTP 500 y el texto del mensaje Maximum request length exceeded . Cuando se lanza esta excepción, IIS7 mata la conexión inmediatamente. Entonces, un HttpModule que redirige a este error solo funcionará si la HttpException se maneja y borra (usando Server.ClearError() ) en Application_Error() en global.asax.cs.

Para archivos cargados con un tamaño mayor que maxAllowedContentLength IIS7 mostrará una página de error detallada con el código de error 404 y subStatusCode 13. La página de error se puede encontrar en C: \ inetpub \ custerr \ es-US \ 404-13.htm

Para redirecciones en este error en IIS7, recomiendo redirigir en httpErrors en httpErrors lugar. Para redirigir a una acción diferente, establezca un valor menor para maxAllowedContentLength que maxRequestLength en web.config y también agregue lo siguiente a web.config:

       

Al ejecutar en IIS6, lo resolví con un HttpModule manejando BeginRequest y comprobé si httpApplication.Context.Request.Length es más grande que maxRequestLength.

Para poder redirigir la solicitud completa debe leerse antes de redireccionar.

Vea el ejemplo de código en este enlace: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html

El enlace de eviews de velocidad fue realmente útil para resolver el problema. Como se dijo, el único inconveniente fue que toda la solicitud (y el archivo) debe leerse antes de que se pueda realizar la redirección.

Pero puede limitarse a ejecutarse solo cuando la página donde está presente el control de carga de archivos se cargue así

 if (HttpContext.Current.Request.Url.ToString().Contains("UploadedPage.aspx") { //read and process page request } 

Debe crear un HttpHandler personalizado que lo haga por usted. ASP.NET matará automáticamente la conexión si el tamaño de carga es demasiado grande (como descubrió).