2013-01-11 40 views
4

開始寫一個簡單的過濾器,以每個動作負載要求拉一些東西來看,複製從其他stackoverflows一些代碼,看起來像這樣:錯誤與簡單ActionFilterAttribute

public class TestKeyAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext context) 
    { 
     if (context.Request.Properties.ContainsKey("test")) 
     { 
     // do stuff 
     } 
    } 
} 

然後用剩下添加的屬性:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter()); 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new TestKeyAttribute()); 
} 

上運行,導致此錯誤:

The given filter instance must implement one or more of the following filter 
interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter. 

大多數我發現的鏈接與MVC 3相關,並且這似乎起作用;然而,我正在使用MVC 4並使用Web API--是否還有其他一些方法需要現在註冊該屬性?

請注意:我不希望將過濾器連接到Web API控制器(將其添加到GlobalConfiguration.Configuration.Filters確實可行),而是使用普通的Web控制器。

編輯:我知道我可以從IActionFilter繼承,而不是使用OnActionExecuting得到這個工作,我只是好奇爲什麼這種方法是行不通的,因爲一堆教程,似乎在說應該。

回答

1

使用MVC4時,您的自定義屬性所在的項目必須包含對System.Web.Http.Common庫的引用。我使用NuGet將它添加到我的項目中,嘿!錯誤消失。

2

這不起作用的原因是您的過濾器是WebAPI過濾器,它不能與Mvc過濾器互換。 Mvc和WebAPI FilterAttribute和相關的類和接口有很多相同的名稱(這就是爲什麼教程似乎說這應該起作用),但它們存在於不同的名稱空間中。 Mvc過濾器類生活在System.Web.Mvc和WebAPI類生活在System.Web.Http

延伸閱讀這裏:https://stackoverflow.com/a/23094418/22392

7

我有同樣的錯誤,並困惑的是ElmahHandledErrorLoggerFilter確實實現IExceptionFilter

經過調查,我踢了自己,我已將filters.Add(new ElmahHandledErrorLoggerFilter());添加到FilterConfig類下的MVC站點配置中。反而將config.Filters.Add(new ElmahHandleErrorApiAttribute());添加到WebApiConfig類中。

注意:我在這裏使用WebAPi v1,但我已經以相同的方式配置了v2項目。

+0

也適合我!謝謝。 – mike123