5

tengo la siguiente ruta en la parte inferior de mi global.asax:MVC: 404 ruta no funciona correctamente en la producción

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

que funciona muy bien en Visual Studio, pero en la producción que estoy recibiendo el error de IIS página.

¿No debería atrapar esta ruta cualquier URL no captada por las demás, por lo tanto, no 404s desde la perspectiva de IIS? ¿Hay algo más que deba hacer en web.config?

Nota: Hago no quiero redireccionar a una URL específica de 404; más bien, estoy sirviendo la página de error 404 en la URL solicitada (creo que este es el enfoque adecuado desde el punto de vista de la usabilidad).

ACTUALIZACIÓN
En mi controlador de error, Soy la creación Response.StatusCode = 404;, que parece ser el problema. Cuando elimino esto y vuelvo a implementar en producción, vuelvo a obtener mis páginas de error amistosas. Sin embargo, creo que hago necesitan el estado 404 en la cabecera HTTP - para fines de SEO - por lo que mi pregunta ahora es:

Cuestión revisada
Cómo/por qué está interceptando IIS la respuesta y el envío de su un error 404 fuera de la caja, y cómo lo evito?

** SOLUCIÓN * *
Dommer lleva el premio por sugerir Response.TrySkipIisCustomErrors=true; la que (creo) era necesario. Pero había 2 otros detalles clave:

  • errores personalizados necesita estar en en web.config (duh!), Y
  • la acción 404 debe tener el atributo [HandleErrors].

Haciendo que funcione en todas partes
Dado que algunas de las URL puede obtener asignada a las rutas que no sean "404-pagenotfound", pero que contienen parámetros no válidos, y como yo no quiero redirigir a la página 404, he creado esta acción en mi base:

[HandleError] 
public ActionResult NotFound() 
{ 
    Response.StatusCode = 404; 
    Response.TrySkipIisCustomErrors = true;  
    return View("PageNotFound", SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));   
} 

y en cualquier controlador de acción que hereda la base, simplemente necesito llamar a esto cada vez que cojo un parámetro de ruta válida:

return NotFound(); 

nota: No RedirectToAction()

de la guinda del pastel:
El modelo he generado y se pasa a la vista es sobre la alimentación de los bits prolijas de la URL en nuestro motor de búsqueda , y mostrar los 3 primeros resultados como sugerencias en la amigable página 404.

+0

contento que te hayas este trabajo. ¡Se ve muy bien! –

Respuesta

4

El problema es que su solicitud coincide con una de sus rutas anteriores y luego falla. Una solución posible es tratar de limitar las otras rutas como esta:

// This will match too many things, so let's constrain it to those we know are valid 
    routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { controller = "Home|OtherController|AnotherController|..." } // regular expression matching all valid controllers 
); 

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

Si desea una respuesta mucho más amplia, y luego mirar esto: How can I properly handle 404 in ASP.NET MVC?

EDIT:

para deshacerse del error personalizado de IIS intente cambiar su controlador de error para que sea así:

Response.StatusCode = 404; 
Response.TrySkipIisCustomErrors=true; // add this line 

MSDN doc: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

+0

Resulta que este no es un problema de correspondencia de ruta. Más bien, sospecho, es un problema de configuración de IIS7. Por favor mira mi actualización en la pregunta. – Faust

+0

He agregado un poco que debería ayudar. –

+0

tenga en cuenta que ha escrito incorrectamente TrySkipIisCustomErrors con una "i" adicional en el medio. – Faust

0

Inténtelo como esto

routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "account", action = "index", id = UrlParameter.Optional } // Parameter defaults 
      ); 


routes.MapRoute(
         "404-PageNotFound", // Route name 
         "{*url}", 
         new { controller = "Error", action = "PageNotFound", id = UrlParameter.Optional } // Parameter defaults 
        ); 
+0

@Prassanth: El propósito de la ruta 404 es atrapar todas las solicitudes inesperadas, por lo que es absolutamente necesario un patrón de ruta wild-card {* url} - {controller}/{action} no funcionará. Por cierto: descubrí más información sobre mi problema y revisé la pregunta. – Faust

+0

he editado el código – Prasanth

+0

Creo que se requiere una redirección de configuración de DNS en IIS. Intenta configurar DNS para hacer la redirección según el requisito – Prasanth

Cuestiones relacionadas