我已經看到了如何在全球範圍內在衆多帖子中做到這一點,並讓它在我的代碼中工作。問題是,它在每次調用射擊這不是我想要的,我只希望它火的調用在那裏我有飾有屬性的方法,這些方法:你可以註冊一個Web API ActionFilter,而不需要在全球範圍內執行它?
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
}
}
這似乎是很基本的對我而言,我錯過了一些東西,但是我可以根據需要激發屬性的唯一方法是使用GlobalConfiguration.Configuration.Filters.Add(new MyAttribute());
在global.asax
中註冊,導致它在請求中觸發MethodA
和MethodB
。有沒有什麼辦法可以註冊屬性,並且只能在標記它的方法上觸發?我曾嘗試使用AttributeUsage
無濟於事。
編輯雖然必須刪除內部工作,但爲每個評論添加了屬性代碼。它的射擊所有的請求......
[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
// Do work
}
}
編輯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);
什麼是MyClass在這裏?...是的,你可以在控制器的操作上裝飾過濾器屬性,只有那些會被你調用,但我看到這裏MyClass不是控制器... –
你應該顯示屬性的源代碼 –
它是一個ApiController,更新了代碼以反映這一點。 – akousmata