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

Prevent a ASP.NET MVC global filter from being applied on Elmah action

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

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

有没有办法在调用 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
    }
}

您可以通过自定义 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());