您是否可以注册Web API ActionFilter而无需全局注册?

ako*_*ata 4 c# asp.net-web-api

我已经看到如何在众多帖子中全局执行此操作并使其在我的代码中工作.问题是它在每次调用时触发这不是我想要的,我只希望它触发对我用该属性修饰方法的方法的调用:

public class MyController : ApiController
{
    [MyAttribute]
    public void MethodA()
    {
        // Do Work - should have called the attribute filter
    }

    public void MethodB()
    {
        // Do Work - should NOT have called the attribute filter
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是很基本的,我和我失去了一些东西,但只有这样,我可以通过它注册获取属性火就大家global.asax使用GlobalConfiguration.Configuration.Filters.Add(new MyAttribute());,导致其开火,请求两MethodAMethodB.有没有办法注册属性,只触发标记它的方法?我试过用AttributeUsage无济于事.

编辑添加了每条评论的属性代码,但必须删除内部工作.它正在解雇所有请求......

[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        // Do work
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑11/25 除了下面我接受答案的信息之外,我想补充说,之前的开发人员已经删除了默认的ActionDescriptorFilterProvider,并且需要注释掉以下代码,以便自定义操作过滤器的默认行为生效:

var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders();
var defaultprovider = providers.First(i => i is ActionDescriptorFilterProvider);

// This line was causing the problem.    
GlobalConfiguration.Configuration.Services.Remove(typeof(System.Web.Http.Filters.IFilterProvider), defaultprovider);
Run Code Online (Sandbox Code Playgroud)

avs*_*099 7

请参阅HttpConfiguration.Filters属性 - 它清楚地说

获取应用于使用此HttpConfiguration实例提供的所有请求的过滤器列表.

但你需要ActionFilter - 根据定义,

操作过滤器包含在执行控制器操作之前和之后执行的逻辑.例如,您可以使用操作过滤器来修改控制器操作返回的视图数据.

基本上你需要做的就是删除

GlobalConfiguration.Configuration.Filters.Add(new MyAttribute());
Run Code Online (Sandbox Code Playgroud)

您的Global.asax.cs文件中的行.