我使用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
}
}
我想将ElmahController
包装在一个可以添加排除过滤器的新版本中,但我不确定如何(如果可能的话)将web.config
更改为引用此包装而不是原始控制器。
答案 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());