2010-05-03 17 views
39

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).Mostrar página de error personalizado cuando la carga de archivos excede el tamaño permitido en ASP.NET MVC

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.

He intentado detectar 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?

Es posible detectar la excepción en Application_Error en global.asax, pero 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".

¿Alguna idea?

¡Gracias de antemano!

Marcus

+3

una respuesta a su pregunta. Uso SWFUpload (http://www.swfupload.org/) y establezco un límite de tamaño de archivo. De esta forma, el cliente no podrá incluso comenzar a cargar un archivo mayor que el límite. Establece el límite en JavaScript de la siguiente manera: file_size_limit: "20 MB". Consulte doc: http://demo.swfupload.org/Documentation –

Respuesta

55

Al ejecutar en IIS7 y hacia arriba no es otro parámetro:

<system.webServer> 
    <security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="10485760" /> 
    </requestFiltering> 
    </security> 
</system.webServer> 

La configuración por defecto es un poco menos de 30 MB.

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

Para los archivos cargados con un tamaño más grande que maxAllowedContentLength IIS7 mostrará una página de error detallado con código de error 404 y subStatusCode 13. La página de error se pueden encontrar en C: \ inetpub \ custerr \ en-US \ 404-13.htm

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

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
    <remove statusCode="404" subStatusCode="13" /> 
    <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" 
     path="http://yoursite.com/Error/UploadTooLarge" responseMode="Redirect" /> 
    </httpErrors> 
</system.webServer> 
+0

¿Cómo se hace esto con IIS6? – Jonathan

+0

@Jonathan: vea esta respuesta http://stackoverflow.com/questions/2759193/display-custom-error-page-when-file-upload-exceeds-allowed-size-in-asp-net-mvc2/2856886#2856886 – Marcus

+1

Una cosa importante a tener en cuenta es que si quiere evitar tener que tratar con el HTTP 500 _Maximum longitud de solicitud excedida_ errores por completo, debe establecer tanto 'maxRequestLength' como' maxAllowedContentLength' en el _smamaño_ (el primero debe expresarse en kilobytes mientras que el último en bytes como [explicado aquí] (http://stackoverflow.com/a/3853785/26396)). De esta forma, no habrá una solicitud cuyo tamaño se encuentre entre los dos valores; solo podrán ser menores o mayores que el umbral. –

0

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

3

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 redirigir.

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

+2

La parte negativa de esta solución es que toda la solicitud (y el archivo) debe leerse antes de poder realizar la redirección. – Marcus

+0

Eso no es algo malo, aunque esa es la única manera. ¿Cuál es la alternativa? Primero, ¿es posible detectar los errores excedidos de maxRequestLength antes de que se haya leído la solicitud completa? Este evento debería capturarse en código, por lo que puede ejecutar algún código de preparación y llamar a Server.Transfer. En segundo lugar, si puede hacer algo antes de que se lea la solicitud completa, y la cancela de alguna manera, ¿cómo responde el navegador web del usuario? ¿Creerá que la conexión falló? – Triynko

1

La velocidad eviews enlace era muy ú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 ser limitada para funcionar sólo cuando la página donde el control de carga de archivos está presente al ser cargado como éste

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