2011-09-28 15 views
10

Sé que podríamos simplemente usar un archivo app_offline.htm para hacer esto.Implementar la página "Abajo para el mantenimiento"

Pero quiero poder acceder al sitio web si mi IP es 1.2.3.4 (por ejemplo), por lo que puedo hacer una prueba final.

if(IpAddress != "1.2.3.4") 
{ 
    return Redirect(offlinePageUrl); 
} 

¿Cómo podemos implementar esto en ASP.NET MVC 3?

+0

Aún puede hacer esto solo con IIS. Configure un nuevo sitio con un enlace de nombre de host diferente que no redirija. No hay necesidad de manchar su código con cosas de "implementación". :) – bzlm

+0

@bzlm ya hemos hecho pruebas con diferentes nombres de host. tenemos que hacer una prueba final de nuevo con el nombre de host real. –

+0

Puedo ver que eso también sucede. – bzlm

Respuesta

14

Usted puede usar un cajón de sastre ruta con un RouteConstraint con la verificación de la propiedad intelectual:

Asegúrese de poner primero la ruta fuera de línea.

routes.MapRoute("Offline", "{controller}/{action}/{id}", 
       new 
        { 
         action = "Offline", 
         controller = "Home", 
         id = UrlParameter.Optional 
        }, 
       new { constraint = new OfflineRouteConstraint() }); 

y el código de restricción:

public class OfflineRouteConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     // return IpAddress != "1.2.3.4"; 
    } 
} 
+0

Solución muy limpia. Hace exactamente lo que necesitaba. Gracias. – nrod

+0

@Rickard, los usuarios en el sitio de compras en vivo se verán afectados por el error cuando cargue '.DLL' para actualizar los cambios de código en el proyecto, por lo que ¿se cancelará la ayuda de mantenimiento? o [statuspage.io] (https://www.statuspage.io/) servicio pago? aquí hay una discusión sobre similar [problema] (http://programmers.stackexchange.com/questions/238767/asp-net-deployment-maintenance-best-practices) – stom

2

puede definir un filtro global que detener todas las peticiones si no provienen de su IP. puedes habilitar el filtro por configuración.

13

La sugerencia de Max aquí es una implementación real.

public class MvcApplication : System.Web.HttpApplication 
{ 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new CheckForDownPage()); 

    } 

    //the rest of your global asax 
    //.... 
} 
public sealed class CheckForDownPage : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var path = System.Web.Hosting.HostingEnvironment.MapPath("~/Down.htm"); 

     if (System.IO.File.Exists(path) && IpAddress != "1.2.3.4") 
     { 
      filterContext.HttpContext.Response.Clear(); 
      filterContext.HttpContext.Response.Redirect("~/Down.htm"); 
      return; 
     } 

     base.OnActionExecuting(filterContext); 
    } 


} 
2

que tiene un bucle infinito en la solución de colemn615, por lo que añade un cheque por la página sin conexión.

Además, para las versiones posteriores de ASP.NET esto se divide en un archivo FilterConfig.cs en la carpeta App_Start.

public class FilterConfig 
{ 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new CheckForDownPage()); 

    } 

    public sealed class CheckForDownPage : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (HttpContext.Current.Request.RawUrl.Contains("Down.htm")) 
      { 
       return; 
      } 

      var path = System.Web.Hosting.HostingEnvironment.MapPath("~/Down.htm"); 

      if (System.IO.File.Exists(path) && IpAddress != "1.2.3.4") 
      { 
       filterContext.HttpContext.Response.Clear(); 
       filterContext.HttpContext.Response.Redirect("~/Down.htm"); 
       return; 
      } 

     base.OnActionExecuting(filterContext); 
    } 
} 
Cuestiones relacionadas