2015-01-28 17 views
9

Tôi đang sử dụng Elmah để ghi nhật ký ngoại lệ trên ứng dụng MVC của mình bằng gói Alex Beletsky's elmah-mvc NuGet.Ngăn chặn bộ lọc toàn cầu ASP.NET MVC không được áp dụng trên hành động Elmah

Ứng dụng đăng ký một số bộ lọc chung, được áp dụng cho mỗi hành động được gọi.

Có cách nào để ngăn không cho một số bộ lọc đó được áp dụng khi gọi trang Elmah.Mvc.ElmahController lỗi nhật ký (foo.com/elmah) không? Một thử nghiệm như dưới đây hoạt động, tất nhiên, nhưng tôi đang tìm kiếm một cách thanh lịch hơn mà sẽ không liên quan đến việc sửa đổi bộ lọc (cũng không phải mã nguồn từ Elmah/Elmah MVC). Thậm chí có thể không?

public class FooAttribute : FilterAttribute, IActionFilter 
{ 
    // ... 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.Controller is ElmahController) 
     { 
      return; 
     } 

     // do stuff 
    } 
} 
  • Tôi biết rằng thuộc tính can't be added or removed at runtime.

  • Tôi đã nghĩ đến việc gói ElmahController vào bộ lọc mới, tôi không chắc cách (nếu có thể) thay đổi web.config để tham khảo trình bao bọc này thay vì bộ điều khiển gốc.

+0

Kiểm tra điều này - http: // s tackoverflow.com/questions/9953760/how-to-disable-a-global-filter-in-asp-net-mvc-selectively – malkam

+0

@malkam Tôi biết điều này. Vấn đề là nó liên quan đến việc trang trí các hành động với một thuộc tính, tức là sửa đổi mã nguồn Elmah, mà tôi không muốn làm, vì lý do rõ ràng. –

+0

giải pháp này không có vẻ khủng khiếp với tôi. Tôi có lẽ sẽ làm điều đó trong tích cực mặc dù: 'if (điều khiển là ElmahController) {// trở lại không có hành động đặc biệt ' – DLeh

Trả lời

6

Bạn có thể đăng ký các bộ lọc toàn cầu của bạn thông qua một tùy chỉnh IFilterProvider:

public class MyFilterProvider : IFilterProvider 
{ 
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     if (controllerContext.Controller is ElmahController) 
     { 
      return Enumerable.Empty<Filter>(); 
     } 

     return ... the collection of your global filters 
    } 
} 

và trong Application_Start của bạn thay vì gọi:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

bạn sẽ gọi:

FilterProviders.Providers.Add(new MyFilterProvider()); 
+0

Đó là ý tưởng. Tôi sẽ phải nhận được các nội bộ Elmah.Mvc.HandleErrorAttribute từ các bộ lọc toàn cầu (nó được tự động đăng ký trong thời gian bắt đầu ứng dụng http://beletsky.net/2012/06/elmahmvc-v200-release-candidate.html), nhưng tôi đoán đây là giải pháp tôi đang tìm kiếm. Cảm ơn! –

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