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.
contento que te hayas este trabajo. ¡Se ve muy bien! –