2011-09-28 9 views
10

So che potremmo semplicemente utilizzare un file app_offline.htm per farlo.Implementare la pagina "Inattivo per manutenzione"

Ma voglio poter accedere al sito Web se il mio IP è 1.2.3.4 (ad esempio), in modo da poter eseguire un test finale.

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

Come possiamo implementarlo in ASP.NET MVC 3?

+0

È ancora possibile farlo solo utilizzando IIS. Configura un nuovo sito con un nome host diverso che non esegue il reindirizzamento. Non c'è bisogno di contaminare il tuo codice con elementi di "distribuzione". :) – bzlm

+0

@bzlm abbiamo già eseguito test con un nome host diverso. dobbiamo eseguire nuovamente un test finale con il nome host reale. –

+0

Posso vedere che sta succedendo anche quello. – bzlm

risposta

14

È possibile utilizzare un catch-all percorso con un RouteConstraint con il controllo di IP:

assicuratevi di mettere prima il percorso non in linea.

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

e il codice vincolo:

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

Soluzione molto pulita. Fa esattamente quello di cui avevo bisogno. Grazie. – nrod

+0

@Rickard, gli utenti del sito di acquisti dal vivo vengono eseguiti con errore quando carico '.DLL' per aggiornare le modifiche al codice nel progetto, quindi scenderanno per la manutenzione? oppure [statuspage.io] (https://www.statuspage.io/) servizio a pagamento? qui è la discussione su simili [problema] (http://programmers.stackexchange.com/questions/238767/asp-net-deployment-maintenance-best-practices) – stom

2

È possibile definire un filtro globale che si fermano tutte le richieste, se non provengono dal vostro IP. puoi abilitare il filtro per configurazione.

13

Il suggerimento di Per Max è un'attuazione reale.

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

Ho ottenuto un ciclo infinito sulla soluzione di colemn615, quindi ho aggiunto un controllo per la pagina offline.

Inoltre, per le versioni successive di ASP.NET questo viene suddiviso in un file FilterConfig.cs nella cartella 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); 
    } 
}