¿Cómo hacer una ruta general para manejar consultas de 'página 404 no encontrada' para ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/310580

Pregunta

¿Es posible crear una ruta final que capture todo ... y devuelva al usuario a una vista 404 en ASP.NET MVC?

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

¿Fue útil?

Solución

Encontré la respuesta yo mismo.

Richard Dingwall tiene una excelente publicación sobre varias estrategias. Particularmente me gusta la solución FilterAttribute. No soy fanático de lanzar excepciones alrededor de willy nilly, así que veré si puedo mejorar eso :)

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

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

Otros consejos

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

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

  

Obtuve mi manejo de errores para trabajar creando 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 puedo ver cómo llegará a ninguna de estas páginas de error si no es así   en la 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.

Me encanta de esta manera ahora porque es muy simple:

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>

También puede manejar el error NO ENCONTRADO 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
    }
}

Agregue estas líneas debajo del archivo web.config de la raíz del proyecto.

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>

Esto puede ser un problema cuando usa

throw new HttpException(404);

Cuando quieres atrapar eso, no conozco otra forma de editar tu configuración web.

Una alternativa a la creación de una ruta global es agregar un método Application_EndRequest a su MvcApplication por Respuesta de Marco's Better-Than-Unicorns MVC 404 .

Dentro de RouterConfig.cs agregue el siguiente código:

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

           });

Si la ruta no se puede resolver, entonces MVC Framework tendrá un error 404. El mejor enfoque es usar filtros de excepción ... Crear un filtro de excepción personalizado y hacer así ...

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top