2011-09-28 14 views
10

Wiem, że możemy po prostu użyć pliku app_offline.htm, aby to zrobić.Implementacja strony "W dół do konserwacji"

Ale chcę mieć dostęp do strony internetowej, jeśli moje IP to 1.2.3.4 (na przykład), tak że mogę wykonać test końcowy.

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

Jak możemy to wdrożyć w ASP.NET MVC 3?

+0

Nadal można to zrobić tylko przy użyciu usług IIS. Skonfiguruj nową witrynę z innym wiązaniem nazwy hosta, która nie powoduje przekierowania. Nie musisz niszczyć kodu za pomocą "rozmieszczenia". :) – bzlm

+0

@bzlm już zrobiliśmy testowanie z inną nazwą hosta. musimy ponownie wykonać test końcowy z prawdziwą nazwą hosta. –

+0

Widzę, że to też się dzieje. – bzlm

Odpowiedz

14

Można użyć catch-all trasy z RouteConstraint ze sprawdzianem IP:

Upewnij się umieścić trasę nieaktywny pierwszy.

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

a kod ograniczenia:

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

Bardzo czyste rozwiązanie. Dokładnie to, czego potrzebowałem. Dzięki. – nrod

+0

@Rickard, użytkownicy witryny zakupów na żywo są wprowadzani błędnie, gdy ładuję plik '.DLL', aby zaktualizować zmiany w projekcie, więc czy pomoc będzie niedostępna? lub [statuspage.io] (https://www.statuspage.io/) płatna usługa? tutaj jest dyskusja na podobny [problem] (http://programmers.stackexchange.com/questions/238767/asp-net-deployment-maintenance-best-practices) – stom

2

Można zdefiniować filtr globalny że zatrzymać wszystkie żądania, jeśli nie pochodzą z Twojego IP. możesz włączyć filtr według konfiguracji.

13

Sugestia Per Max tutaj jest faktyczną realizacją.

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

Dostałem nieskończoną pętlę na rozwiązaniu colemn615, więc dodałem czek na stronę offline.

Ponadto w przypadku późniejszych wersji programu ASP.NET jest on dzielony na plik FilterConfig.cs w folderze 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); 
    } 
}