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
HandleErrorAttribute
como un filtro de acción global en laFilterConfig
clase 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 OnException
método de la HandleErrorAttribute
clase 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 elCustomerErrors
elemento//you may want to set this to 200
en 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
ErrorPage
controladorAgregue vistas para estas dos acciones (clic derecho -> Agregar vista). Deben aparecer en una carpeta llamada ErrorPage.
Dentro
App_Start
abreFilterConfig.cs
y comenta el filtro de manejo de errores.Dentro de web.config agregue las siguientes
<customerErrors>
entradas, enSystem.Web
Prueba (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.cs
Recomendarí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_Error
mé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.web
para almacenar en caché excepciones dentro de la aplicación, como return HttpNotFound ()y
system.webServer
para 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