Respuesta

6

Como dices, puedes configurar maxRequestLength en tu web.config (anulando los 4MB predeterminados de tu machine.config) y si se superan estos límites, normalmente obtienes un error HTTP 401.1.

Con el fin de manejar un error HTTP genérica a nivel de aplicación se puede configurar una sección de 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 mostró el error va a ser redirigido el usuario a su página de error personalizada.

Si desea una página especializada para cada error que puede hacer algo como:

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

Y así sucesivamente.

De manera alternativa, podría editar la pestaña CustomErrors de las propiedades de su directorio virtual desde IIS para que apunte a su error al manejar las páginas de su elección.

Lo anterior no parece funcionar para 401.x errores - este artículo en código del proyecto explica una solución para un lo que parece ser un problema muy similar: Redirecting to custom 401 page

+0

Gracias, esta es una guía completa sobre el manejo de errores, termino exactamente con la misma pieza de xml. Sin embargo, esto no ayuda al caso cuando se excede la longitud de la solicitud. – st78

+0

Consulte la última edición y avíseme si se le ocurre algo – JohnIdol

+0

Para aquellos que vienen a esta página y no saben cómo configurar maxRequestLength: [MSDN] (http://msdn.microsoft.com/en-us/ library/e1f13641.aspx) –

-1

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

+0

No funciona - asp.net no puede llegar a este punto. – st78

+0

Muy bien, eso es nuevo para mí, pensé que puedes verificar la longitud del contenido primero antes que decidir subir el archivo/rechazarlo. –

+0

Gracias por la información, acabo de comprobarlo y falla. Es bueno saberlo ya que lo he usado antes y no me di cuenta de que hay un problema con él. –

0

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

Lo que puede hacer a lo sumo es mostrar una página de error amigable con cláusula de redireccionamiento simple dentro del controlador OnError() y en esa página tener algún enlace posterior o funcionalidad similar para devolver al usuario a la página donde desencadenó el error en primer lugar.

Actualización:

que tenía que poner en práctica verificación exacta sobre la carga de archivos recientemente y lo que ocurrió con SWFUpload es la biblioteca que se reunió totalmente mis necesidades y también tiene un montón de características adicionales. Lo usé junto con el envoltorio jquery proporcionado por Steve Sanderson. Más detalles se pueden encontrar here.

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

Además, puede implementar la detección de detección de flash si desea degradar con gracia al botón de carga nativa0 en caso de que el cliente no tenga instalado flash.

+0

Es verdad, puedo detectar excepciones en OnError, sin embargo, Response.Redirect() no hace nada. – st78

1

Desafortunadamente, probablemente necesite IIS7 y atrape esto con un controlador personalizado, ya que IIS6 nunca llegará al nivel donde puede ver el tamaño del archivo. Solo puede saber el tamaño cuando se realiza la carga o si tiene un error.

Este es un problema conocido en ASP.NET. Otra alternativa (coja) es manejar esto antes en la solicitud y quizás usar un cargador basado en flash. John enlaces a varios en el siguiente enlace.

actualización: Jon Galloway parecía tener looked deeper into this problem y parece que un RIA-Registro es la única alternativa sensata, ya que IIS parece que siempre tiene que tragar el archivo y luego le dirá que es a grandes.

+0

Nuestro servidor ejecuta IIS7, ¿puede proporcionar algún enlace/palabras clave donde buscar una respuesta sobre cómo superar este problema? – st78

1

Sergei,

por JohnIdol de respuesta, debe configurar una página de error personalizada para el código de estado . ej .:

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

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

Espero que ayude.

+1

Extraño, obtengo el error 500 al 'Exceder la longitud máxima de solicitud'. –

0

La mejor forma de manejar grandes cargas es utilizar una solución que implemente un HttpModule que dividirá el archivo en fragmentos. Cualquiera de las soluciones pre-laminadas que se encuentran allí debería permitirle limitar el tamaño del archivo. Muchos otros han publicado enlaces a los que están en esta página, así que no me molestaré. Sin embargo, si no desea molestarse con que puede manejar esto en su aplicación Global.asax Application_Error evento. Si su aplicación es .NET 4.0, se adhieren este bloque de código en el que hay:

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 se está ejecutando en un marco anterior, probar el código aquí (está en VB, pero es fácil de traducir): http://www.webdeveloper.com/forum/showthread.php?t=52132

Cuestiones relacionadas