【问题标题】:Prevent a ASP.NET MVC global filter from being applied on Elmah action防止在 Elmah 操作上应用 ASP.NET MVC 全局过滤器
【发布时间】:2015-01-28 13:06:22
【问题描述】:

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

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

有没有办法在调用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 以引用此包装器而不是原控制器。

【问题讨论】:

  • @malkam 我知道这个。问题是它涉及用属性装饰动作,即修改 Elmah 源代码,我不想这样做,原因很明显。
  • 这个解决方案对我来说似乎并不那么糟糕。不过,我可能会积极地这样做:if(controller is ElmahController) { //return with no special actions
  • @DLeh 你说得对,还不错,我同意。我只是在寻找实现这一点的方法,而不必更改过滤器本身,这样当我需要排除它们时,我就不必使用 ElmahController 更改每个过滤器。
  • 也许你可以让你的过滤器扩展一个在一个地方有这个代码的基本过滤器?

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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多