2015-01-28 12 views
9

Sto utilizzando Elmah per la registrazione delle eccezioni sulla mia applicazione MVC utilizzando il pacchetto NuGet Alex Beletsky's elmah-mvc.Impedire l'applicazione di un filtro globale ASP.NET MVC all'azione Elmah

L'applicazione registra alcuni filtri globali, applicati a ciascuna azione denominata.

C'è un modo per impedire che alcuni di questi filtri vengano applicati quando si chiama la pagina di registro degli errori Elmah.Mvc.ElmahController (foo.com/elmah)?

Un test come di seguito funziona, ovviamente, ma sto cercando un modo più elegante che non implichi la modifica del filtro (né il codice sorgente di Elmah/Elmah MVC). È possibile?

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

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

     // do stuff 
    } 
} 
  • So che attribuisce can't be added or removed at runtime.

  • ho pensato di avvolgere il ElmahController in uno nuovo in cui ho potuto aggiungere un filtro di esclusione, ma non sono sicuro di come (se possibile) per cambiare il web.config fare riferimento a queste involucro al posto del controller originale.

+0

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

+0

@malkam Conosco questo. Il problema è che implica la decorazione dell'azione con un attributo, cioè la modifica del codice sorgente Elmah, che non voglio fare, per ovvi motivi. –

+0

questa soluzione non mi sembra così terribile. Probabilmente lo farei in positivo però: 'if (controller è ElmahController) {// return senza azioni speciali ' – DLeh

risposta

6

Si potrebbe registrare i filtri globali attraverso una consuetudine 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 
    } 
} 

e nel vostro Application_Start invece di chiamare:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

si sarebbe chiamata:

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

Questa è l'idea. Dovrò ottenere l'Elmah.Mvc.HandleErrorAttribute interno dai filtri globali (viene automaticamente registrato durante l'avvio dell'app http://beletsky.net/2012/06/elmahmvc-v200-release-candidate.html), ma io Immagino che questa sia la soluzione che sto cercando. Grazie! –

Problemi correlati