Es posible crear una ruta final que atrapa a todos .. y rebota al usuario un mensaje de error 404 vista en ASP.NET MVC?

NOTA: no quiero instalar esto en mi configuración de IIS.

InformationsquelleAutor Pure.Krome | 2008-11-21

8 Comentarios

  1. 72

    Encontrado la respuesta a mí mismo.

    Richard Dingwall tiene un excelente post de ir a través de diversas estrategias. Me gusta especialmente la FilterAttribute solución. Yo no soy un fan de lanzar excepciones alrededor queramos o no, así que voy a ver si puedo mejorar en eso 🙂

    Para el mundial.asax, sólo tiene que añadir este código como su última ruta a registrar:

    routes.MapRoute(
        "404-PageNotFound",
        "{*url}",
        new { controller = "StaticContent", action = "PageNotFound" }
        );
    • He intentado esto, pero no funciona. He puesto la ruta en mi ruta por defecto, pero todavía me dan error 404.
    • Hmm. creo que funciona para mí.
    • ¿Puede por favor explicar exactamente qué tengo que asumir yo soy muy nuevo en MVC.
    • 2 cosas. a) agregar que la última ruta a tu lista de rutas. b) crear un controlador (en mi ejemplo, yo he llamado StaticContentController) con un método de Acción (en mi ejemplo, he añadido un método llamado PageNotFound(..)) agregar la lógica de este método para mostrar el error 404 de página no encontrada, Ver.
    • Si usted todavía tiene la ruta por defecto (I. E. {controller}/{action}/{id}) en registerroutes al() se va a atrapar todas las Url que coincida con el formato normal de un MVC solicitud. En otras palabras, el catch-all de la ruta sólo puede interceptar una mala URL, si no encaja en el formato normal (bla/bla/bla/bla). En el caso de un inexistente controlador de la excepción debe ser manejado a través de convencionales ASP.NET la manipulación. Hay una buena descripción de la manipulación en la stackoverflow.com/questions/619895/…
    • De hecho, el ‘catch all’ es tal vez no es el mejor enfoque. Comentarios sobre esta respuesta pls: stackoverflow.com/questions/619895/…
    • es derecho. Puedo superar esto por solo crear explícitamente una ruta para cada controlador. PERO la magia {*url} todavía no superar este problema. ¿Qué pasa si la URL asignada a la ruta está disponible, pero el controlador/acción en sí misma no encontrado. Si me vaya a /Home/About123 feo asp.net página de error todavía, porque en la ruta no llegar a la {*url} pero manejado en mi casa de la ruta.
    • Asegúrese de que las rutas se asignan en el orden correcto.
    • no es en su Routeconfig debe agregar el código.

  2. 19

    Esta pregunta fue la primera, pero la más fácil respuesta llegó más tarde en una pregunta:

    Enrutamiento personalizado ASP.NET MVC página de Error 404

    Tengo mi control de errores para trabajar por la creación de un ErrorController que
    devuelve los puntos de vista en este artículo. Yo también tuve que agregar el «Catch All»
    a la ruta en el mundial.asax.

    No puedo ver cómo va a llegar a cualquiera de estas páginas de error si es que no
    en la Web.config..? A Mi Web.config tenía que especificar:

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

    y, a continuación, también he añadido:

    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>
    • Que es lo que tengo ahora, pero estoy tratando de reemplazar con una mejor solución que no fue el primero en enviar una respuesta 302 para el cliente, pero un 404 directamente. Cambiar el redirectMode a ResponseRewrite y verás que no funciona más… 🙁
    • Desde esta respuesta, he encontrado que la mejor forma es la que se describe en esta pregunta: stackoverflow.com/questions/1171035/… prefiero no redirigir al usuario a una URL diferente porque es menos amigable para el usuario (incluso a mí me resulta molesto, mientras que el desarrollo). Saludos.
    • Estoy recibiendo el error Config Error: The configuration section 'customErrors' cannot be read because it is missing a section declaration.
  3. 6

    También se puede controlar NO se ENCUENTRA el error Global.asax.cs de la siguiente

    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
        }
    }
  4. 4

    Añadir estas líneas marco de su proyecto web raíz.el Archivo config.

     <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>

    • Gracias esto es lo que yo necesitaba. En caso de que alguien se cae en el mismo problema que me existingResponse=»Reemplazar» se corrigió. Me había Auto set en el que hay antes de que es la opción que se sugiere en la mayoría de los puestos. Supongo auto en mi caso, el escenario no fue capaz de determinar el uso de reemplazar.
  5. 3

    Este puede ser un problema cuando se utiliza

    throw new HttpException(404);

    Cuando se quiere coger, yo no sé de ninguna otra manera, a continuación, la edición de su web config.

    • ActionFilters : uso de ellos para coger el HttpException.
    • Lo que si no se produce la excepción por un controlador de acción? Me tira un error 404 en mi controlador de fábrica.
    • No estoy seguro, a continuación, – no estoy jugando con las fábricas de controlador. soz.
    • Controllerfactory no es el único lugar donde se puede pasar. Yo mapa una captura de toda la ruta a un actionmethod que sólo produce la excepción. La excepción es manejado por la web.config
    • Lanzar cualquier Exception desea. Vamos todos a su controlador de derivada de una BaseController. En este BaseController reemplazar OnException y establecer el filterContext.El resultado de redireccionamiento o los resultados de la vista.
  6. 1

    Dentro de RouterConfig.cs agregar el siguiente trozo de código:

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

    Si la ruta no puede ser resuelta, entonces marco de MVC a través de 404 error..
    El mejor enfoque es utilizar Filtros de Excepción … Crear una personalizada exceptionfilter y hacer como esta..

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

Dejar respuesta

Please enter your comment!
Please enter your name here