2013-11-21 13 views
4

我已經看到了如何在全球範圍內在衆多帖子中做到這一點,並讓它在我的代碼中工作。問題是,它在每次調用射擊這不是我想要的,我只希望它火的調用在那裏我有飾有屬性的方法,這些方法:你可以註冊一個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中註冊,導致它在請求中觸發MethodAMethodB。有沒有什麼辦法可以註冊屬性,並且只能在標記它的方法上觸發?我曾嘗試使用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); 
+1

什麼是MyClass在這裏?...是的,你可以在控制器的操作上裝飾過濾器屬性,只有那些會被你調用,但我看到這裏MyClass不是控制器... –

+0

你應該顯示屬性的源代碼 –

+0

它是一個ApiController,更新了代碼以反映這一點。 – akousmata

回答

7

看到HttpConfiguration.Filters Property - 上面清清楚楚地寫着

獲取適用於所有請求的過濾器列表使用此服務 HttpConfiguration實例。

,但你需要ActionFilter - 這是根據定義,

行動過濾器包含被前後 控制器動作執行執行的邏輯。對於 實例,可以使用操作篩選器來修改控制器操作返回的視圖數據。

所以基本上你需要做的是刪除您的Global.asax.cs文件

GlobalConfiguration.Configuration.Filters.Add(new MyAttribute()); 

線。

+0

嗯,好吧,這是接近給我一個答案。我看到這是如何在我的OOB示例項目上工作的情況。我將深入瞭解我們的過濾器與註冊處理程序的交互並回報。如果它能幫我解決問題,我會將其標記爲答案,謝謝。 – akousmata

相關問題