ASP.NET: ¿cómo mostrar una página de error al cargar un archivo grande (se excedió la longitud máxima de la solicitud)?

StackOverflow https://stackoverflow.com/questions/126167

Pregunta

La aplicación puede registrar un error en OnError, pero no podemos realizar ninguna redirección para mostrar algo significativo al usuario.¿Algunas ideas?Sé que podemos configurar maxRequestLength en web.config, pero de todos modos el usuario puede exceder este límite y es necesario mostrar algún error normal.

¿Fue útil?

Solución

Como usted dice, puede configurar maxRequestLength en su web.config (anulando los 4 MB predeterminados de su machine.config) y si se exceden estos límites, generalmente obtendrá un error HTTP 401.1.

Para manejar un error HTTP genérico a nivel de aplicación, puede configurar una sección CustomError en su web.config dentro de la sección system.web:

<system.web>
   <customErrors mode=On defaultRedirect=yourCustomErrorPage.aspx />
</system.web>

Cada vez que se muestre el error, el usuario será redirigido a su página de error personalizada.

Si quieres una página especializada para cada error puedes hacer algo como:

<system.web>    
   <customErrors mode="On" defaultRedirect="yourCustomErrorPage.aspx">
     <error statusCode="404" redirect="PageNotFound.aspx" />
   </customErrors>
</system.web>

Etcétera.

Alternativamente, puede editar la pestaña CustomErrors de las propiedades de su directorio virtual desde IIS para que apunte a las páginas de manejo de errores que elija.

Lo anterior no parece funcionar para errores 401.x; este artículo del proyecto de código explica una solución alternativa para lo que parece ser un problema muy similar: Redirigir a la página 401 personalizada

Otros consejos

Desafortunadamente, probablemente necesitará IIS7 y detectará esto con un controlador personalizado, ya que IIS6 nunca llegará al punto en el que pueda ver el tamaño del archivo.Solo puede saber el tamaño cuando termina de cargar o recibe un error.

Este es un problema conocido en ASP.NET.Otra alternativa (poco convincente) es manejar esto antes en la solicitud y tal vez usar un cargador basado en flash. John enlaza a varios en el siguiente enlace..

Actualizar:Jon Galloway parecía haber miró más profundamente en este problema y parece que un cargador RIA es la única alternativa sensata, ya que IIS siempre parece tener que tragarse el archivo Y LUEGO decirle que es demasiado grande.

Serguéi,

Según la respuesta de JohnIdol, debe configurar una página de error personalizada para el 413 código de estado.p.ej.:

    <customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
                    <error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
    </customErrors>

Lo sé porque tuve que resolver el mismo problema en el proyecto de un cliente y esta fue la solución que funcionó para mí.Desafortunadamente fue la única solución que encontré...no fue posible detectar este problema particular en el código;por ejemplo, verificar la longitud del archivo publicado como sugirió snomag, o detectar un error en global.asax.Al igual que usted, también probé estos otros enfoques antes de encontrar una solución que funcionara.(De hecho, finalmente encontré esto en algún lugar de la web cuando estaba trabajando en mi problema).

Espero que ayude.

Debería poder detectar el error en Global.asax - controlador OnError().Pero desafortunadamente, su solicitud inicial finalizará y no podrá mostrar la misma página de carga con alguna notificación de error al usuario.

Lo que puede hacer como máximo es mostrar una página de error amigable con una cláusula de redireccionamiento simple desde el controlador OnError() y en esa página tener algún vínculo de retroceso o funcionalidad similar para devolver al usuario a la página donde desencadenó el error en la primera lugar.

Actualizar:

Tuve que implementar una verificación exacta al cargar el archivo recientemente y lo que se me ocurrió es SWFSubir biblioteca que cumplió totalmente con mis requisitos y también tiene muchas características adicionales.Lo usé junto con el contenedor jquery proporcionado por Steve Sanderson.Se pueden encontrar más detalles aquí.

El punto es que flash es capaz de detectar el tamaño del archivo en el lado del cliente y reaccionar adecuadamente si se cumple este caso.Y creo que esto es exactamente lo que necesitas.

Además, puede implementar la verificación de detección de flash si desea degradar elegantemente al botón de carga nativo 0 en caso de que el cliente no tenga flash instalado.

La mejor manera de manejar cargas grandes es utilizar una solución que implemente un HttpModule que dividirá el archivo en partes.Cualquiera de las soluciones prediseñadas que existen debería permitirle limitar el tamaño del archivo.Muchos otros han publicado enlaces a los de esta página, así que no me molestaré.Sin embargo, si no quieres molestarte con eso, poder maneje esto en el evento Global.asax Application_Error de su aplicación.Si su aplicación es .NET 4.0, inserte este bloque de código allí:

    if (ex.InnerException != null && ex.InnerException.GetType() == typeof(HttpException) && ((HttpException)ex.InnerException).WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //Handle and redirect here, you can use Server.ClearError() and Response.Redirect("FileTooBig.aspx") or whatever you choose
    }

Fuente: http://justinyue.wordpress.com/2010/10/29/handle-the-maximum-request-length-exceeded-error-for-asyncfileupload-control/

Si está ejecutando un marco anterior, pruebe el código aquí (está en VB, pero es fácil de traducir): http://www.webdeveloper.com/forum/showthread.php?t=52132

Puede verificar la longitud del archivo publicado (FileUpload.PostedFile.ContentLength), para ver si está por debajo del límite o no y simplemente mostrar un mensaje de error amigable si es necesario.

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