2011-09-28 5 views
10

간단히 app_offline.htm 파일을 사용하면됩니다."유지 관리를 위해 다운"페이지 구현

하지만 내 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

당신은 IP 체크와 RouteConstraint와 포괄 경로를 사용할 수 있습니다

가 먼저 오프라인 경로를 넣어 있는지 확인하십시오.

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

및 제약 코드 : 그들은 당신의 IP에서 오지 않는 경우

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/) 유료 서비스? 여기 비슷한 [issue] (http://programmers.stackexchange.com/questions/238767/asp-net-deployment-maintenance-best-practices)에 대한 토론이 있습니다. – stom

2

당신은 모든 요청을 중지 글로벌 필터를 정의 할 수 있습니다. 구성별로 필터를 활성화 할 수 있습니다.

13

여기 Max의 제안은 실제 구현입니다.

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); 
    } 
} 
관련 문제