2011-09-28 28 views
10

Tôi biết chúng tôi chỉ đơn giản có thể sử dụng tệp app_offline.htm để thực hiện việc này.Thực hiện trang "Xuống để bảo trì"

Nhưng tôi muốn có thể truy cập trang web nếu IP của tôi là 1.2.3.4 (ví dụ), để tôi có thể thực hiện thử nghiệm cuối cùng.

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

Làm cách nào chúng tôi có thể triển khai điều này trong ASP.NET MVC 3?

+0

Bạn vẫn có thể thực hiện việc này chỉ bằng IIS. Thiết lập một trang mới với một liên kết tên máy chủ khác không chuyển hướng. Không cần phải làm mờ mã của bạn bằng công cụ "triển khai". :) – bzlm

+0

@bzlm, chúng tôi đã thực hiện thử nghiệm với tên máy chủ lưu trữ khác nhau. chúng ta cần thực hiện thử nghiệm cuối cùng lần nữa với tên máy chủ thực. –

+0

Tôi cũng có thể thấy điều đó xảy ra. – bzlm

Trả lời

14

Bạn có thể sử dụng tuyến bắt tất cả bằng RouteConstraint với kiểm tra IP:

Đảm bảo bạn đặt tuyến đường ngoại tuyến trước.

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

và mã hạn chế:

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

Giải pháp rất sạch sẽ. Có chính xác những gì tôi cần. Cảm ơn. – nrod

+0

@Rickard, người dùng trên trang web mua sắm trực tiếp bị ảnh hưởng do lỗi khi tôi tải lên '.DLL' để cập nhật thay đổi mã trong dự án, vì vậy sẽ giảm để được trợ giúp bảo trì? hoặc [statuspage.io] (https://www.statuspage.io/) dịch vụ trả tiền? đây là thảo luận về [vấn đề] tương tự (http://programmers.stackexchange.com/questions/238767/asp-net-deployment-maintenance-best-practices) – stom

2

Bạn có thể xác định một bộ lọc toàn cầu ngăn chặn tất cả các yêu cầu nếu họ không đến từ IP của bạn. bạn có thể bật bộ lọc theo cấu hình.

13

Đề xuất của mỗi tối đa ở đây là triển khai thực tế.

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

Tôi nhận được vòng lặp vô hạn về giải pháp của colemn615, vì vậy tôi đã thêm một kiểm tra cho trang ngoại tuyến.

Ngoài ra, đối với các phiên bản sau này của ASP.NET, tệp này được chia thành tệp FilterConfig.cs trong thư mục 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); 
    } 
} 
Các vấn đề liên quan