2011-09-28 33 views
10

我知道我們可以簡單地使用app_offline.htm文件來執行此操作。執行「Down for maintenance」頁面

但我希望能夠訪問網站,如果我的IP是1.2.3.4(例如),以便我可以做最後的測試。

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

我們如何在ASP.NET MVC 3中實現這個?

+0

您仍然可以使用IIS進行此操作。使用不重定向的不同主機名綁定來設置新站點。不需要用「部署」東西來污染你的代碼。 :) – bzlm

+0

@bzlm我們已經用不同的主機名進行了測試。我們需要再次用真正的主機名進行最終測試。 –

+0

我可以看到發生這種情況。 – bzlm

回答

14

您可以使用一個包羅萬象的路線與RouteConstraint與IP檢查:

確保你先放離線路徑。

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

和約束代碼:

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

非常乾淨的解決方案。正是我所需要的。謝謝。 – nrod

+0

@Rickard,當我上傳'.DLL'來更新項目中的代碼更改時,實時購物網站上的用戶會遇到錯誤,因此維護幫助會下降嗎?或[statuspage.io](https://www.statuspage.io/)付費服務?這裏討論類似的[問題](http://programmers.stackexchange.com/questions/238767/asp-net-deployment-maintenance-best-practices) – stom

2

您可以定義一個全局過濾器,阻止所有的請求,如果他們不從你的IP來。您可以通過配置啓用過濾器。

13

每馬克斯的建議在這裏是一個實際的實施。

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

我在colemn615的解決方案上得到了一個無限循環,所以我添加了一個離線頁面檢查。

此外,對於ASP.NET的更高版本,這將分成App_Start文件夾中的FilterConfig.cs文件。

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); 
    } 
}