¿Cómo hacer una captura de todas las rutas para manejar las consultas de la “página 404 no encontrada” para ASP.NET MVC?

¿Es posible crear una ruta final que atrape todo … y haga rebotar al usuario a una vista 404 en ASP.NET MVC?

NOTA: No quiero configurar esto en mi configuración de IIS.

Encontré la respuesta yo mismo.

Richard Dingwall tiene una excelente publicación pasando por varias estrategias. Me gusta particularmente la solución FilterAttribute. No soy partidario de arrojar excepciones por buen camino, así que veré si puedo mejorar eso 🙂

Para el archivo.asax global, simplemente agregue este código como su última ruta para registrarse:

routes.MapRoute( "404-PageNotFound", "{*url}", new { controller = "StaticContent", action = "PageNotFound" } ); 

Esta pregunta fue primero, pero la respuesta más fácil vino en una pregunta posterior:

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

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" 

Espero que esto ayude.

Amo de esta manera ahora porque es muy simple:

     

Esto podría ser un problema cuando uses

 throw new HttpException(404); 

Cuando quieres ver eso, no sé de otra manera que editar tu configuración web.

Agregue estas líneas a su proyecto raíz web.config Archivo.

            

También puede manejar el error NOT FOUND en Global.asax.cs como se muestra a continuación

 protected void Application_Error(object sender, EventArgs e) { Exception lastErrorInfo = Server.GetLastError(); Exception errorInfo = null; bool isNotFound = false; if (lastErrorInfo != null) { errorInfo = lastErrorInfo.GetBaseException(); var error = errorInfo as HttpException; if (error != null) isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound; } if (isNotFound) { Server.ClearError(); Response.Redirect("~/Error/NotFound");// Do what you need to render in view } } 

Una alternativa para crear una ruta catch-all es agregar un método Application_EndRequest a su aplicación MvcApplication por la respuesta MVC 404 de Better-Than-Unicorns de Marco .

Si la ruta no se puede resolver, entonces MVC framework pasará por el error 404. El mejor enfoque es usar filtros de excepción … Crear un filtro de excepción personalizado y hacer esto …

 public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html"); } } 

Dentro de RouterConfig.cs agrega la siguiente pieza de código:

  routes.MapRoute( name: "Error", url: "{id}", defaults: new { controller = "Error", action = "PageNotFound" });