Enrutamiento para la página de error personalizada de ASP.NET MVC 404

Intento crear una página de error HTTP 404 personalizada cuando alguien escribe una URL que no invoca una acción o controlador válido en ASP.NET MVC, en lugar de mostrar el error genérico de “recursos no encontrados” de ASP.NET.

No quiero usar web.config para manejar esto.

¿Hay algún tipo de magia de enrutamiento que pueda hacer para detectar cualquier URL inválida?

Actualización: Probé la respuesta dada, sin embargo, sigo recibiendo el desagradable mensaje “Recurso no encontrado”.

Otra actualización: Ok, aparentemente algo cambió en RC1. Incluso he intentado atrapar específicamente 404 en una HttpException y todavía me da la página “Recursos no encontrados”.

Incluso he usado la función de recursos de MvcContrib y nada, el mismo problema. ¿Algunas ideas?

Simplemente agregue atrapar todas las rutas al final de la tabla de rutas y visualice la página que desee con ella.

Ver: ¿Cómo puedo capturar todas las rutas para manejar consultas de ‘404 páginas no encontradas’ para ASP.NET MVC?

Intenté habilitar los errores personalizados en el servidor de producción durante 3 horas, parece que encontré la solución final de cómo hacerlo en ASP.NET MVC sin ninguna ruta.

Para habilitar los errores personalizados en la aplicación ASP.NET MVC necesitamos (IIS 7+):

  1. Configure las páginas personalizadas en la configuración web en la sección system.web :

         

    RemoteOnly significa que en la red local verá errores reales (muy útiles durante el desarrollo). También podemos reescribir la página de error para cualquier código de error.

  2. Establecer el parámetro de respuesta mágica y el código de estado de la respuesta (en el módulo de manejo de errores o en el atributo de control de errores)

      HttpContext.Current.Response.StatusCode = 500; HttpContext.Current.Response.TrySkipIisCustomErrors = true; 
  3. Establezca otra configuración mágica en la configuración web en la sección system.webServer :

      

Esto fue lo último que encontré y después de esto puedo ver errores personalizados en el servidor de producción.

Logré que funcionara mi error al crear un ErrorController que devuelve las vistas en este artículo. También tuve que agregar el “Catch All” a la ruta en global.asax.

No veo cómo llegará a ninguna de estas páginas de error si no está en Web.config ..? Mi Web.config tuvo que especificar:

 customErrors mode="On" defaultRedirect="~/Error/Unknown" 

y luego también agregué:

 error statusCode="404" redirect="~/Error/NotFound" 

Fuente

NotFoundMVC : proporciona una página 404 fácil de usar cuando no se encuentra un controlador, acción o ruta en su aplicación ASP.NET MVC3. Se representa una vista llamada NotFound en lugar de la página de error predeterminada de ASP.NET.

Puede agregar este complemento a través de nuget usando: Install-Package NotFoundMvc

NotFoundMvc se instala automáticamente durante el inicio de la aplicación web. Maneja todas las diferentes formas en que generalmente lanza ASP.NET MVC una 404 HttpException. Esto incluye un controlador faltante, acción y ruta.

Guía de instalación paso a paso:

1 – Haga clic con el botón derecho en su Proyecto y seleccione Administrar paquetes de Nuget …

2 – Busque NotFoundMvc e instálelo. enter image description here

3 – Una vez que la instalación se haya completado, se agregarán dos archivos a su proyecto. Como se muestra en las capturas de pantalla a continuación.

enter image description here

4 – Abra el recién agregado NotFound.cshtml presente en Views / Shared y modifíquelo a su gusto. Ahora ejecute la aplicación y escriba una url incorrecta, y será recibido con una página 404 amigable.

enter image description here

No más, los usuarios recibirán mensajes de error como Server Error in '/' Application. The resource cannot be found. Server Error in '/' Application. The resource cannot be found.

Espero que esto ayude 🙂

PD: Felicitaciones a Andrew Davey por hacer un plugin tan increíble.

Pruebe esto en web.config para reemplazar las páginas de error de IIS. Esta es la mejor solución, supongo, y envía el código de estado correcto también.

         

Más información de Tistack – Use páginas de errores personalizados ASP.NET MVC

Esta solución no necesita cambios de archivos web.config o rutas catch-all.

Primero, crea un controlador como este;

 public class ErrorController : Controller { public ActionResult Index() { ViewBag.Title = "Regular Error"; return View(); } public ActionResult NotFound404() { ViewBag.Title = "Error 404 - File not Found"; return View("Index"); } } 

A continuación, cree la vista en “Vistas / Error / Index.cshtml” como;

  @{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

We're sorry, page you're looking for is, sadly, not here.

A continuación, agregue lo siguiente en el archivo Global asax de la siguiente manera:

 protected void Application_Error(object sender, EventArgs e) { // Do whatever you want to do with the error //Show the custom error page... Server.ClearError(); var routeData = new RouteData(); routeData.Values["controller"] = "Error"; if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404)) { routeData.Values["action"] = "Index"; } else { // Handle 404 error and response code Response.StatusCode = 404; routeData.Values["action"] = "NotFound404"; } Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line IController errorsController = new ErrorController(); HttpContextWrapper wrapper = new HttpContextWrapper(Context); var rc = new System.Web.Routing.RequestContext(wrapper, routeData); errorsController.Execute(rc); Response.End(); } 

Si aún obtiene la página de error de IIS personalizada después de hacer esto, asegúrese de que las siguientes secciones estén comentadas (o vacías) en el archivo de configuración web:

        

Si trabajas en MVC 4, puedes ver esta solución, funcionó para mí.

Agregue el siguiente método Application_Error a mi Global.asax :

 protected void Application_Error(object sender, EventArgs e) { Exception exception = Server.GetLastError(); Server.ClearError(); RouteData routeData = new RouteData(); routeData.Values.Add("controller", "Error"); routeData.Values.Add("action", "Index"); routeData.Values.Add("exception", exception); if (exception.GetType() == typeof(HttpException)) { routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode()); } else { routeData.Values.Add("statusCode", 500); } IController controller = new ErrorController(); controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); Response.End(); 

El controlador en sí es muy simple:

 public class ErrorController : Controller { public ActionResult Index(int statusCode, Exception exception) { Response.StatusCode = statusCode; return View(); } } 

Compruebe el código fuente completo de Mvc4CustomErrorPage en GitHub .

Tuve el mismo problema, lo que tienes que hacer es, en lugar de agregar el atributo customErrors en el archivo web.config de tu carpeta Views, debes agregarlo en el archivo web.config en la carpeta raíz de tus proyectos.

Aquí hay una respuesta verdadera que permite personalizar completamente la página de error en un solo lugar. No es necesario modificar web.config o crear un código separado.

Funciona también en MVC 5.

Agregue este código al controlador:

  if (bad) { Response.Clear(); Response.TrySkipIisCustomErrors = true; Response.Write(product + I(" Toodet pole")); Response.StatusCode = (int)HttpStatusCode.NotFound; //Response.ContentType = "text/html; charset=utf-8"; Response.End(); return null; } 

Basado en http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages