阻止 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
}
}
我知道属性can't be added or removed at runtime。
我想将 ElmahController
包装在一个可以添加排除过滤器的新包中,但我不确定如何(如果可能)更改 web.config
来引用这个包装器而不是原来的控制器。
您可以通过自定义 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());
我在使用 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
}
}
我知道属性can't be added or removed at runtime。
我想将
ElmahController
包装在一个可以添加排除过滤器的新包中,但我不确定如何(如果可能)更改web.config
来引用这个包装器而不是原来的控制器。
您可以通过自定义 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());