2013-08-19 30 views
6

Tôi cần tạo một số hành động của trình điều khiển trợ giúp và các chế độ xem được liên kết, mà tôi muốn có khả năng (có điều kiện?) Vô hiệu hóa trong quá trình sản xuất.ASP.NET MVC làm thế nào để vô hiệu hóa các tuyến đường gỡ lỗi/quan điểm trong sản xuất?

Một cách sẽ là #ifdef DEBUG pragmas xung quanh các tuyến đường cụ thể trong cơ thể RegisterRoutes(), nhưng điều đó không linh hoạt chút nào.

Cài đặt trong web.config sẽ chỉ là tốt, nhưng tôi không chắc chắn cách kết nối.

Làm thế nào để thành lập "plugin" dự án như Glimpse hoặc Phil Haack của già Route Debugger làm điều đó?

Tôi muốn làm điều gì đó đơn giản hơn so với một cái gì đó YAGNI ...

Trả lời

2
@if (HttpContext.Current.IsDebuggingEnabled) 
{ 
} 

Lớp

public class UrlInformation 
{ 
    [XmlElement(ElementName = "ActionName")] 
    public string ActionName { get; set; } 

    [XmlElement(ElementName = "ControllerName")] 
    public string ControllerName { get; set; } 

    [XmlElement(ElementName = "AreaName")] 
    public string AreaName { get; set; } 
} 

Class cho XML Serializaion

[XmlTypeAttribute(AnonymousType = true)] 
public class clsUrlInformation 
{ 
    [XmlElement("Files")] 
    public List<UrlInformation> Url { get; set; } 

    public clsUrlInformation() 
    { 
     Url = new List<UrlInformation>(); 
    } 
} 

mẫu XML (Xác định tên phương pháp hành động debug/controller/khu vực của bạn ở đây)

<?xml version="1.0" ?> 
<Url> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName>Home</ControllerName> 
    <ActionName>Index</ActionName> 
    </Files> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName></ControllerName> 
    <ActionName></ActionName> 
    </Files>      
</Url> 

Filter Action

public class MyActionClass : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(
             ActionExecutingContext filterContext) 
    { 

Hãy nói rằng bạn có XML. XML chứa thông tin về Diện tích, phương pháp hành động Tên và điều khiển Tên

var xml = 
@"<?xml version=""1.0"" ?> 
<Url> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName>Home</ControllerName> 
    <ActionName>Index</ActionName> 
    </Files> 
    <Files> 
    <AreaName></AreaName> 
    <ControllerName></ControllerName> 
    <ActionName></ActionName> 
    </Files>      
</Url>"; 

Làm serialization XML và chuyển đổi XML vào danh sách của Class.

 var serializer = new XmlSerializer(typeof(clsUrlInformation), 
           new XmlRootAttribute("Url")); 
     using (var stringReader = new StringReader(xml)) 
     using (var reader = XmlReader.Create(stringReader)) 
     { 
      clsUrlInformation result = 
        (clsUrlInformation)serializer.Deserialize(reader); 
      RouteData Route = 
        filterContext.Controller.ControllerContext.RouteData; 
      String controller = Convert.ToString(Route.Values["controller"]); 
      String action = Convert.ToString(Route.Values["action"]); 
      String area = Convert.ToString(Route.DataTokens["area"]); 

So sánh các hành động hiện tại với xml để hiển thị 404

  foreach (var item in result.Url) 
      { 
       if (HttpContext.Current.IsDebuggingEnabled && 
          controller == item.ControllerName && 
           action == item.ActionName  && 
            area == item.AreaName) 
       { 
        filterContext.Result = new HttpNotFoundResult(); 
        return; 
       } 
      } 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

@CristiDiaconescu: Khi đề cập đến các url debug trong file XML sẽ được linh hoạt hơn. TẠI SAO? Bởi vì, sau này bạn có thể sửa đổi trong XML của bạn để tăng/giảm/cập nhật thông tin url mà không làm thay đổi mã và không triển khai dll. Phải không?

+0

Hai phương pháp đầu tiên của bạn trông giống như mã Razor, tại thời điểm này có thể đã quá muộn - Tôi muốn có URL gỡ lỗi (danh sách)) 'có thể bị vô hiệu hóa - tức là đánh chúng sẽ trả về 404, không phải trang ustom (trống?). Tuy nhiên, +1 cho HttpContext.Current.IsDebuggingEnabled –

+0

@CristiDiaconescu: ** [Thay vì đề cập đến các tuyến đường trong tệp mã, bạn có thể đề cập đến trong tệp XML như đã đề cập trong bài đăng này] (http://stackoverflow.com/a/ 18362259/2015869) ** –

+0

@CristiDiaconescu: Đề cập đến các url gỡ lỗi trong tệp XML sẽ linh hoạt hơn. TẠI SAO? Bởi vì, sau này bạn có thể sửa đổi trong XML của bạn để tăng/giảm/cập nhật thông tin url mà không làm thay đổi mã và không triển khai dll. Phải không? –

9

Bạn cũng có thể sử dụng một bộ lọc, ví dụ như ném lớp này ở đâu đó:

public class DebugOnlyAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(
              ActionExecutingContext filterContext) 
     { 
      #if DEBUG 
      #else 
       filterContext.Result = new HttpNotFoundResult(); 
      #endif 
     } 
    } 

Sau đó, bạn sẽ có thể chỉ cần thả vào bộ điều khiển và trang trí các phương pháp hành động (hoặc toàn bộ điều khiển), bạn không cần xuất hiện trong sản xuất với [DebugOnly].

Bạn cũng có thể sử dụng filterContext.HttpContext.IsDebuggingEnabled thay vì xấu xí #if DEBUG Tôi chỉ muốn được nghiêng để sử dụng các chỉ thị tiền biên dịch kể từ khi quyết định là chắc chắn sẽ không thực hiện bất kỳ chu kỳ CPU như vậy.

Nếu thay vào đó bạn muốn có một bộ lọc toàn cầu để kiểm tra tất cả mọi thứ chống lại một vài URL, đăng ký nó như một bộ lọc toàn cầu trong Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

    filters.Add(new DebugActionFilter()); 
} 

Sau đó, bạn chỉ có thể kiểm tra địa chỉ URL hoặc bất cứ điều gì bạn muốn chống lại danh sách (Đường dẫn tương đối ứng dụng được hiển thị tại đây):

public class DebugActionFilter : IActionFilter 
{ 
    private List<string> DebugUrls = new List<string> {"~/Home/", 
                 "~/Debug/"}; 
    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.IsDebuggingEnabled 
      && DebugUrls.Contains(
         filterContext 
        .HttpContext 
        .Request 
        .AppRelativeCurrentExecutionFilePath)) 
     { 
      filterContext.Result = new HttpNotFoundResult(); 
     } 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    } 
} 
+0

Điều này có vẻ sạch sẽ. Cảm ơn! –

Các vấn đề liên quan