Páginas de error personalizadas con diseño

He estado luchando para que funcionen las páginas de error personalizadas y sigo encontrando el camino de regreso a simplemente usar una página estática. Aunque la página estática funciona, sería necesario volver a crear la barra de navegación que nos gustaría evitar en este momento. Actualmente estoy usando lo siguiente para especificar páginas de error personalizadas.

Manejo de errores de Asp.net

   

Manejo de errores IIS

     

¿Existe algún método para implementar páginas de error dinámicas personalizadas que puedan manejar tanto los errores de IIS como los de Asp.net?

Solucioné el mismo problema en mis proyectos ASP.Net MVC canalizando todo a través de .Net a través de controladores.

              

Primero se creó un ErrorController para manejar los errores de solicitud y las solicitudes no encontradas.

 [AllowAnonymous] public class ErrorController : Controller { // GET: Error public ActionResult NotFound() { Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; Response.TrySkipIisCustomErrors = true; HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; HttpContext.Response.TrySkipIisCustomErrors = true; return View(); } public ActionResult Error() { Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; Response.TrySkipIisCustomErrors = true; return View(); } } 

Notarás que llamo a TrySkipIisCustomErrors para tratar de evitar los errores de IIS

Luego se creó un controlador base para manejar todas las acciones desconocidas que se ErrorController.NotFound a la acción ErrorController.NotFound .

 public abstract class FrontOfficeControllerBase : Controller { protected override void HandleUnknownAction(string actionName) { var data = ViewData; //Custom code to resolve the view. //ViewResult view = this.View(c => c.NotFound()); //Manually create view with view Data ViewResult view = new ViewResult(); view.ViewData = new ViewDataDictionary(); view.ViewData["controller"] = "Error"; view.ViewData["action"] = "NotFound"; if (data != null && data.Count > 0) { data.ToList().ForEach(view.ViewData.Add); } Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound; Response.TrySkipIisCustomErrors = true; view.ExecuteResult(this.ControllerContext); } } 

Todos los Controllers heredarían de este controlador base.

Se configuró una ruta catch all después de todas las demás rutas.

 routes.MapRoute( name: "404-NotFound", url: "NotFound", defaults: new { controller = "Error", action = "NotFound" } ); routes.MapRoute( name: "500-Error", url: "Error", defaults: new { controller = "Error", action = "Error" } ); routes.MapRoute( name: "CatchAll", url: "{*any}", defaults: new { controller = "Error", action = "NotFound" }); 

Esto me aseguró que si una ruta no coincidía con ninguno de mis controladores, se dirigiría de manera segura a la acción ErrorController.NotFound .

Para las vistas, creé los respectivos NotFound.shtml y Error.cshtml paginados en la carpeta Views/Shared y se beneficiaron del acceso al diseño raíz, que es lo que creo que estabas buscando.

Al final, pude eliminar tanto los customErrors como los httpErrors de web.config ya que ya no los necesitaba, ya que cada aplicación era gestionada por los manejadores y se enrutaba en consecuencia.

La idea original para esta estructura provino de este artículo en el que mezclé y combiné las opciones disponibles hasta que encontré una solución que funcionaba / se adaptaba a mis necesidades.

Manejo de excepciones en ASP.NET MVC (se explican 6 métodos)

Espero que esto ayude.

Luché con esto también y busqué durante mucho tiempo. Por lo que puedo decir, no hay forma de crear una página de error personalizada dinámica que se sirva para errores de IIS para solicitudes que no ingresan a la tubería .net. Al igual que usted, terminé teniendo dos páginas de error 404. Un archivo .aspx dynamic para el archivo no genera errores como resultado de las solicitudes que ingresaron a la tubería .net, y uno .html para las solicitudes de archivos no encontrados que nunca ingresaron a la canalización de .net. La persona que rechazó su pregunta probablemente no se dio cuenta de que está haciendo una pregunta muy buena y difícil, que no tiene una solución fácil. Retiraré tu pregunta para ayudar a compensar.