c# - enable - Mostrar página de error personalizada cuando la carga del archivo excede el tamaño permitido en ASP.NET MVC
publish asp.net web api to iis (4)
Mi principal problema es que quiero mostrar una página de error personalizada cuando un archivo cargado excede el tamaño permitido (maxRequestLength en web.config).
Cuando se carga el archivo grande, se emite una HttpException antes de que se invoque mi método de acción de carga en el controlador. Esto es lo esperado.
He intentado 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?
Sin embargo, es posible detectar la excepción en Application_Error en global.asax, pero ni Response.Redirect ni Server.Transfer funcionan para redirigir a la página de error personalizada. Server.Transfer muestra el error "Error al procesar la solicitud secundaria" y response.redirect genera el error "Los encabezados HTTP ya enviados".
¿Algunas ideas?
¡Gracias por adelantado!
Marcus
Al ejecutarlo en IIS6, lo resolví con un HttpModule manejando BeginRequest y verificando si httpApplication.Context.Request.Length es mayor que maxRequestLength.
Para poder redirigir la solicitud completa hay que leerla antes de redirigir.
Vea el ejemplo de código en este enlace: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html
Cuando se ejecuta bajo IIS7 y hacia arriba hay otro parámetro:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="10485760" />
</requestFiltering>
</security>
</system.webServer>
La configuración predeterminada es ligeramente inferior a 30 MB.
Para los archivos cargados con tamaño entre maxRequestLength
y maxAllowedContentLength
IIS7 emitirá 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. Por lo tanto, un HttpModule
que redirige este error solo funcionará si la HttpException
se maneja y borra (utilizando 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 / en-US / 404-13.htm
Para las redirecciones de este error en IIS7, recomiendo la redirección en httpErrors
. 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:
<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>
El enlace de las vistas de velocidad fue realmente útil para resolver el problema. Como se dijo, el único inconveniente era que la solicitud completa (y el archivo) debe leerse antes de que se pueda realizar la redirección.
Pero se puede limitar para que se ejecute solo cuando la página donde está presente el control de carga del archivo se carga de esta manera
if (HttpContext.Current.Request.Url.ToString().Contains("UploadedPage.aspx")
{
//read and process page request
}
Necesita crear un HttpHandler personalizado que lo haga por usted. ASP.NET eliminará automáticamente la conexión si el tamaño de la carga es demasiado grande (como lo descubrió).