2015-01-28 11 views
9

Używam Elmah do rejestrowania wyjątków w mojej aplikacji MVC przy użyciu pakietu NuGet Alex Beletsky's elmah-mvc.Zapobieganie zastosowaniu filtru globalnego ASP.NET MVC w działaniu Elmah

Aplikacja rejestruje niektóre filtry globalne, stosowane dla każdej wywołanej akcji.

Czy istnieje sposób, aby uniemożliwić zastosowanie niektórych z tych filtrów podczas wywoływania strony dziennika błędów Elmah.Mvc.ElmahController (foo.com/elmah)?

Test jak poniżej działa, oczywiście, ale szukam bardziej eleganckiego sposobu, który nie wymagałby modyfikacji filtra (ani kodu źródłowego z Elmah/Elmah MVC). Czy to możliwe?

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

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

     // do stuff 
    } 
} 
  • Wiem, że atrybuty can't be added or removed at runtime.

  • myślałem owijania ElmahController w nowym, gdzie mogę dodać filtr wykluczeń, ale nie jestem pewien, w jaki sposób (jeśli to możliwe), aby zmienić web.config odwołać to opakowanie zamiast oryginalnego sterownika.

+0

Sprawdź to - http: // s tackoverflow.com/questions/9953760/how-to-disable-a-global-filter-in-asp-net-mvc-selectively – malkam

+0

@malkam Znam ten. Problem polega na tym, że polega to na dekorowaniu akcji atrybutem, tj. Modyfikowaniu kodu źródłowego Elmah, czego nie chcę robić z oczywistych powodów. –

+0

to rozwiązanie nie wydaje mi się tak straszne. Prawdopodobnie zrobiłbym to jednak pozytywnie: 'if (kontrolerem jest ElmahController) {// powrót bez żadnych specjalnych akcji ' – DLeh

Odpowiedz

6

Można zarejestrować swoje globalne filtry poprzez zwyczaju 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 
    } 
} 

iw swojej Application_Start zamiast dzwonić:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

nazwałbyś:

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

Oto pomysł. Będę musiał pobrać wewnętrzny Elmah.Mvc.HandleErrorAttribute z filtrów globalnych (zostanie on automatycznie zarejestrowany podczas uruchamiania aplikacji http://beletsky.net/2012/06/elmahmvc-v200-release-candidate.html), ale ja Domyślam się, że to jest rozwiązanie, którego szukam. Dzięki! –

Powiązane problemy