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

xle*_*ier 9 asp.net asp.net-mvc elmah action-filter

我正在使用Elmah使用Alex Beletsky的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
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 我知道在运行时无法添加或删除属性.

  • 我想ElmahController在一个新的包装我可以添加一个排除过滤器,但我不知道如何(如果可能)更改web.config引用此包装而不是原始控制器.

Dar*_*rov 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
    }
}
Run Code Online (Sandbox Code Playgroud)

而在你Application_Start而不是打电话:

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
Run Code Online (Sandbox Code Playgroud)

你会打电话给:

FilterProviders.Providers.Add(new MyFilterProvider());
Run Code Online (Sandbox Code Playgroud)