Estoy tratando de hacer un custom HTTP error 404 de página cuando alguien escribe en una dirección URL
que no invocar una acción válida o controlador en ASP.NET MVC, en lugar de mostrar el genérico de «Recurso No Encontrado» ASP.NET error.

No quiero usar la web.config para manejar esto.

Hay algún tipo de enrutamiento de la magia que puede hacer para coger cualquier invalid Url?

Actualización: traté de la respuesta dada, sin embargo todavía tengo la fea «Recurso» No se Encuentra el mensaje.

Otra actualización: Ok, al parecer algo ha cambiado en la RC1. Incluso he intentado específicamente reventado 404 en un HttpException y sólo me da el «Recurso» No se Encontró la página.

Incluso he usado MvcContrib de recursos de la función y nada, mismo problema. Alguna idea?

  • Duplicar stackoverflow.com/questions/310580/…
  • Que es la solución que añadió que junto con la invalidación de la HandleUnknownAction para mostrar una página no se encuentra a la vista cuando una acción no existe y, a continuación, la incorporada en ASP.net controladores de error personalizado para manejar algo más flojo que los usuarios puedan escribir.
  • Esto funciona así stackoverflow.com/questions/619895/…
  • Odio cuando otros usuarios se presuntuoso y dicen cosas como, «¿por qué quieres hacer eso? Solo hacer esto…» Pero me gustaría sugerir que, si no hay nada que le impida el uso de la web.config enfoque y que satisface sus necesidades, es un estándar y elegante enfoque. Cualquier comentario sobre que enfoque se aprecia, como muy bien podría ser algún problema con él que yo no sé acerca de.
  • Relacionados: ¿Cómo puedo manejar adecuadamente 404 en ASP.NET MVC?
  • Ver: Página de Error Personalizada con ASP.Net MVC 4
  • Esta es la duplicación de la pregunta, como la principal aceptado la respuesta en realidad apunta a que la página, así que es un tipo de enlace única respuesta sin dar ninguna solución satisfactoria.

InformationsquelleAutor dswatik | 2009-02-16

10 Comentarios

  1. 10

    Acaba de agregar la captura toda la ruta al final de la tabla de rutas y de pantalla de cualquier página que quieras con él.

    Ver: ¿Cómo puedo hacer una captura de toda la ruta a manija «404 página no encontrada’ consultas para ASP.NET MVC?

    • He intentado esto, sin embargo, todavía se me pone la fea ASP.NET de Recursos predeterminado No se Encontró el Mensaje..
    • No me parece un definitivo (y flexible!!) la solución a este problema ni en esta respuesta ni en el enlace proporcionado.
    • Yo tampoco…esto parece como una especie de hacky respuesta. Estoy buscando más una manera de hacer customErrors se comportan como lo hacen en WebForms. Alguna idea?
    • Esto no funciona & es malo en principio. No trabajo porque no coger malos Url que coincida con uno de los anteriores goleada de los patrones. Malo en principio porque convierte lo que debe ser un error no es un error. Redirigir a una página que se ha denominado el «Error» es diferente de redirigir a una página de error. Desea mantener como un error, el error de registro, luego manejar como un error. Los errores son una valiosa información.
  2. 103

    He intentado habilitar errores personalizados en el servidor de producción durante 3 horas, parece que he encontrado la solución definitiva de cómo hacer esto en ASP.NET MVC sin ningún tipo de rutas.

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

    1. Configurar páginas personalizadas en la web de configuración bajo system.web sección:

      <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
          <error statusCode="404" redirect="~/error/Error404" />
          <error statusCode="500" redirect="~/error" />
      </customErrors>

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

    2. Conjunto magia parámetro de Respuesta y la respuesta de código de estado (en el manejo de errores del módulo o en error de identificador de atributo)

        HttpContext.Current.Response.StatusCode = 500;
        HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    3. Establecer otra magia de configuración en el web config bajo system.webServer sección:

      <httpErrors errorMode="Detailed" />

    Esta fue la última cosa que he encontrado y después de esto puedo ver los errores personalizados en el servidor de producción.

    • Esto todavía no es una solución ideal. No hay adecuada códigos de respuesta HTTP. El uso de customErrors resultados en una redirección 302 acaba de cargar la página de error.
    • Nunca he visto soluciones ideales 🙂
    • Yo instalación de un ErrorController para cada código de estado y el conjunto de los Códigos de Respuesta dentro de esas acciones y se establecen los códigos de respuesta muy bien.. he probado con el Violinista y 404 códigos de estado de responder con un mensaje de error 404 y páginas con más de 500 errores de responder con una de 500. Y en ambos casos mi error personalizado vistas de las que se sirven
    • mi compañero de equipo, sólo eliminado vista de Error en Compartida de la carpeta, para hacer error en tiempo de ejecución con 500 código de estado para redirigir a la Página de Error Personalizada como se mencionó aquí y aquí. Espero ayude a alguien.
  3. 41

    Tengo mi control de errores para trabajar por la creación de un ErrorController que devuelve a las opiniones 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 no está 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"
    • Gracias – que me ayudó, 2 años más tarde! ¿Qué hacer si usted sólo quiere un error personalizado para 404, nada más?
    • otro año más tarde… no establece la defaultRedirect, excluir el atributo por completo.
  4. 27

    Fuente

    NotFoundMVC – Proporciona un fácil de usar 404 de página cada vez que un controlador, la acción o la ruta no se encuentra en su ASP.NET MVC3 aplicación.
    Una vista llamada NotFound se representa en lugar de la predeterminada ASP.NET página de error.

    Usted puede añadir este complemento a través de nuget el uso de:
    Instalar El Paquete De NotFoundMvc

    NotFoundMvc se instala automáticamente durante la aplicación web de start-up. Se encarga de todas las diferentes maneras en que un 404 HttpException suele ser arrojado por ASP.NET MVC. Esto incluye que falta un controlador, la acción y la ruta.

    Paso a Paso Guía de Instalación :

    1 – clic Derecho en el Proyecto y Seleccione Administrar Paquetes de Nuget…

    2 – Búsqueda de NotFoundMvc e instalarlo.
    Enrutamiento personalizado ASP.NET MVC página de Error 404

    3 – una Vez que la instalación se ha completado, dos archivos será agregado a su proyecto. Como se muestra en las capturas de pantalla a continuación.

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

    4 – Abrir el recién agregado NotFound.cshtml presente en puntos de vista, Compartir y modificar a su voluntad. Ahora ejecute la aplicación y escriba una dirección url incorrecta, y usted será recibido con una página de error 404.

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

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

    Espero que esta ayuda 🙂

    P. S : Felicitaciones a Andrew Davey para hacer un plugin impresionante.

    • Hace esto de forma apropiada los códigos de respuesta HTTP?
    • De mirar el código fuente aparece para establecer el código de respuesta 404, así que sí.
  5. 19

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

    <system.webServer>
      <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="404" subStatusCode="-1" />
        <remove statusCode="500" subStatusCode="-1" />
        <error statusCode="404" path="Error404.html" responseMode="File" />
        <error statusCode="500" path="Error.html" responseMode="File" />
      </httpErrors>
    </system.webServer>

    Más info de Tipila de Uso de la Páginas de Error Personalizadas ASP.NET MVC

    • +1. Esta es la única cosa que parecía trabajar de forma constante para mí en MVC5 con múltiples áreas.
    • Esta es la solución más fácil. Usted no puede utilizar la sintaxis de afeitar en su página de error, aunque.
  6. 15

    Esta solución no necesita de la web.archivo de configuración de cambios o catch-todas las rutas.

    Primero, crear 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, crear la vista en «Vistas/Error/Index.cshtml» como;

     @{
          Layout = "~/Views/Shared/_Layout.cshtml";
      }                     
      <p>We're sorry, page you're looking for is, sadly, not here.</p>

    A continuación, agregue el siguiente en la escala Global de asax archivo como a continuación:

    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 usted todavía consigue la costumbre de IIS página de error después de hacer esto, asegúrese de que los siguientes apartados se comentan(o vacío) en el web config file:

    <system.web>
       <customErrors mode="Off" />
    </system.web>
    <system.webServer>   
       <httpErrors>     
       </httpErrors>
    </system.webServer>
    • No creo que este método funcionará en todas las instancias, desde un 404 a menudo es interceptado por el servidor web y, por tanto, nunca manejado a nivel de aplicación.
    • Quiero añadir que si usted va con este enfoque, yo recomendaría añadir un Response.End(); hasta el final de su Application_Error controlador. Sin esto, sólo la primera ocurrencia de un error se activa para una sesión determinada, lo cual es un problema cuando se tiene, por ejemplo, la costumbre de registro de errores en el Application_Error controlador.
  7. 5

    Si usted trabaja en MVC 4, se puede ver este solución, que trabajó 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();
        }
    }

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

  8. 0

    Tuve el mismo problema, lo que tienes que hacer es, en lugar de añadir la customErrors atributo en la web.archivo de configuración en la carpeta Views, usted tiene que añadir en la web.archivo de configuración en sus proyectos de la carpeta raíz

  9. 0

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

    Funciona también en MVC 5.

    Agregar 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

  10. 0

    Voy a hablar de algunos casos específicos,

    si usted está usando ‘PageNotFound método’ en HomeController, como el de abajo

    [Route("~/404")]
    public ActionResult PageNotFound()
    {
      return MyView();
    }

    no funcionaría esto. Pero usted debe borrar Ruta etiquetas, como el de abajo,

    //[Route("~/404")]
    public ActionResult PageNotFound()
    {
      return MyView();
    }

    Y si es como el Nombre del método en la web.config funciona.
    Sin embargo, no se olvide de hacer un código similar al siguiente en la web.config

    <customErrors mode="On">
      <error statusCode="404" redirect="~/PageNotFound" /> 
     *//it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
    </customErrors>

Dejar respuesta

Please enter your comment!
Please enter your name here