2015-01-28 3 views
9

Я использую Elmah для регистрации исключений в моем приложении MVC с использованием Alex Beletsky's elmah-mvc пакета NuGet.Предотвращение применения глобального фильтра ASP.NET MVC для действия Elmah

Приложение регистрирует некоторые глобальные фильтры, применяемые к каждому вызванному действию.

Есть ли способ предотвратить использование некоторых из этих фильтров при вызове страницы журнала ошибок (foo.com/elmah)?

Тест, как показано ниже, работает, конечно, но я ищу более элегантный способ, который не включал бы изменение фильтра (и исходного кода от Elmah/Elmah MVC). Возможно ли это?

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

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

     // do stuff 
    } 
} 
  • Я знаю, что атрибуты can't be added or removed at runtime.

  • Я думал обертывание ElmahController в новой, где я мог бы добавить исключение фильтр, но я не уверен, как (если это возможно), чтобы изменить web.config ссылаться на эту обертку вместо оригинального контроллера.

+0

Проверьте это - http: // s tackoverflow.com/questions/9953760/how-to-disable-a-global-filter-in-asp-net-mvc-selectively – malkam

+0

@malkam Я знаю этот. Проблема состоит в том, что он включает в себя украшение действия атрибутом, то есть изменение исходного кода Elmah, который я не хочу делать по очевидным причинам. –

+0

Это решение для меня не кажется таким страшным. Я бы, вероятно, сделал это в позитиве, хотя: 'if (controller is ElmahController) {// возвращать без специальных действий' – DLeh

ответ

6

Вы можете зарегистрировать свои глобальные фильтры через обычая 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 
    } 
} 

и в вашем Application_Start вместо вызова:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

вы бы назвали:

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

Это идея. Мне придется получить внутренний Elmah.Mvc.HandleErrorAttribute из глобальных фильтров (он автоматически регистрируется во время запуска приложения http://beletsky.net/2012/06/elmahmvc-v200-release-candidate.html), но я думаю, это решение, которое я ищу. Благодаря! –