阻止ASP.NET MVC全局过滤器应用于Elmah操作

时间:2015-01-28 13:06:22

标签: asp.net asp.net-mvc elmah action-filter

我使用Elmah使用Alex Beletsky's elmah-mvc NuGet包在我的MVC应用程序上记录异常。

应用程序注册了一些全局过滤器,应用于每个被调用的动作。

有没有办法在调用Elmah.Mvc.ElmahController错误日志页面(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更改为引用此包装而不是原始控制器。

1 个答案:

答案 0 :(得分: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());