Quiero que se muestre una página de error personalizada para 500, 404 y 403. Esto es lo que he hecho:
Se habilitaron errores personalizados en web.config de la siguiente manera:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors>Registrado
HandleErrorAttributecomo un filtro de acción global en laFilterConfigclase de la siguiente manera:public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }Creó una página de error personalizada para cada uno de los mensajes anteriores. El predeterminado para 500 ya estaba disponible de fábrica.
En cada vista de página de error personalizada se declara que el modelo de la página es
System.Web.Mvc.HandleErrorInfo
Para 500, muestra la página de error personalizada. Para otros, no lo hace.
¿Hay algo que este olvidando?
Parece que esto no es todo lo que hay para mostrar errores personalizados mientras leo el código en el OnExceptionmétodo de la HandleErrorAttributeclase y solo maneja 500.
¿Qué debo hacer para manejar otros errores?
fuente

Respuestas:
Mi configuración actual (en MVC3, pero creo que todavía se aplica) se basa en tener una
ErrorController, así que uso:Y el controlador contiene lo siguiente:
Y las vistas tal como las implementas. Sin embargo, tiendo a agregar un poco de lógica, para mostrar el seguimiento de la pila y la información de error si la aplicación está en modo de depuración. Entonces Error.cshtml se parece a esto:
fuente
redirectMode="ResponseRewrite"en elCustomerErrorselemento//you may want to set this to 200en el código. ¡NO HAGAS ESO!He hecho la solución de pablo y siempre tuve el error (MVC4)
Para deshacerse de esto, quite la línea
en FilterConfig.cs
fuente
Hago algo que requiere menos codificación que las otras soluciones publicadas.
Primero, en mi web.config, tengo lo siguiente:
Y el controlador (/Controllers/ErrorPageController.cs) contiene lo siguiente:
Y finalmente, la vista contiene lo siguiente (despojado por simplicidad, pero puede contactarse:
Es tan simple como eso. Podría extenderse fácilmente para ofrecer información de error más detallada, pero ELMAH maneja eso para mí y el statusCode & statusDescription es todo lo que generalmente necesito.
fuente
Parece que hay una serie de pasos aquí mezclados. Voy a presentar lo que hice desde cero.
Crea el
ErrorPagecontroladorAgregue vistas para estas dos acciones (clic derecho -> Agregar vista). Deben aparecer en una carpeta llamada ErrorPage.
Dentro
App_StartabreFilterConfig.csy comenta el filtro de manejo de errores.Dentro de web.config agregue las siguientes
<customerErrors>entradas, enSystem.WebPrueba (por supuesto). Lance una excepción no controlada en su código y vea que vaya a la página con id 500, y luego use una URL para una página que no existe para ver 404.
fuente
An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.Todo lo que obtuve de su código está en el archivo web.config, agregué<error redirect = "~/ControllerName/ActionName" statusCode="404"/>y funcionó bien :) El resto del código fue de la respuesta de @Pablo. Estoy usando MVC 5 y 6. marco de la entidad que no me quitofilters.Add(new HandleErrorAttribute())deFilterConfig.csRecomendaría usar el archivo Global.asax.cs.
fuente
Sobre la base de la respuesta publicada por maxspan, he reunido un proyecto de muestra mínimo en GitHub que muestra todas las partes de trabajo.
Básicamente, simplemente agregamos un
Application_Errormétodo a global.asax.cs para interceptar la excepción y darnos la oportunidad de redirigir (o más correctamente, la solicitud de transferencia ) a una página de error personalizada.Controlador de error:
Vista de página de error:
Nada más está involucrado, aparte de deshabilitar / eliminar
filters.Add(new HandleErrorAttribute())en FilterConfig.csSi bien es muy simple de implementar, el único inconveniente que veo en este enfoque es usar la cadena de consulta para entregar información de excepción a la página de error de destino.
fuente
Tenía todo configurado, pero aún no podía ver las páginas de error adecuadas para el código de estado 500 en nuestro servidor provisional, a pesar de que todo funcionaba bien en los servidores de desarrollo local.
Encontré esta publicación de blog de Rick Strahl que me ayudó.
Necesitaba agregar
Response.TrySkipIisCustomErrors = true;a mi código de manejo de errores personalizado.fuente
Aquí está mi solución. Usar [ExportModelStateToTempData] / [ImportModelStateFromTempData] es incómodo en mi opinión.
~ / Views / Home / Error.cshtml:
~ / Controllers / HomeController.sc:
~ / Controllers / BaseController.sc:
~ / Controllers / MyController.sc:
Te deseo proyectos exitosos ;-)
fuente
Puede obtener errores que funcionen correctamente sin hackear global.cs, jugar con HandleErrorAttribute, hacer Response. TrySkipIisCustomErrors, conectar Application_Error o lo que sea:
En system.web (solo lo habitual, activar / desactivar)
y en system.webServer
Ahora las cosas deberían comportarse como se esperaba, y puede usar su ErrorController para mostrar lo que necesite.
fuente
Parece que llegué tarde a la fiesta, pero deberías comprobar esto también.
Entonces,
system.webpara almacenar en caché excepciones dentro de la aplicación, como return HttpNotFound ()y
system.webServerpara detectar errores que fueron capturados por IIS y no llegaron al marco asp.netEn el último caso se preocupan por la respuesta del cliente a continuación, cambiar la
responseMode="Redirect"aresponseMode="File"y servir a un archivo HTML estático, ya que éste se mostrará una página amigable con un código de respuesta 200.fuente
En web.config agregue esto bajo la etiqueta system.webserver como se muestra a continuación,
y agregue un controlador como,
y agreguen sus puntos de vista respetados, esto funcionará definitivamente, supongo para todos.
Esta solución la encontré en: Neptune Century
fuente