2011-09-28 32 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); 
    } 
}