首先爲何說這是一個坑,是由於咱們在webapi中使用filter的時候也許會先百度一下,好吧,挖坑的來了,我看了好幾篇文章寫的是使用System.Web.Mvc.Filters.ActionFilterAttribute。web
而後開始痛苦的調試,發現這個過濾器永遠調不進來(windows azure mobile services除外)。then.... 仍是Google吧 !windows
痛苦後才懂,原來不是這麼一回事,ActionFilterAttribute 有2個不一樣的版本,一個在System.Web.Mvc空間下,另一個則在System.Web.Http.Filters命名空間下。他們有何區別?api
The System.Web.Http one is for Web API; the System.Web.Mvc one is for previous MVC versions.mvc
You can see from the source that the Web API version has several differences.spa
好吧,原來System.Web.Mvc.Filters.ActionFilterAttribute是給mvc用的,咱們要用System.Web.Http.Filters下的,知道這樣了 就開始了改寫過程....,運行調試,發現異常!!!調試
先看下異常代碼:code
1 public class FilterConfig 2 { 3 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4 { 5 filters.Add(new HandleErrorAttribute()); 6 filters.Add(new PushFilter()); 7 } 8 }
「System.InvalidOperationException」類型的異常在 System.Web.Mvc.dll 中發生,但未在用戶代碼中進行處理
其餘信息: 給定的篩選器實例必須實現如下一個或多個篩選器接口: System.Web.Mvc.IAuthorizationFilter、System.Web.Mvc.IActionFilter、
System.Web.Mvc.IResultFilter、System.Web.Mvc.IExceptionFilter、System.Web.Mvc.Filters.IAuthenticationFilter。
這是爲什麼呢。。。 明明就是這個過濾器,爲何仍是會有異常? 原來問題在FilterConfig 這個類裏面,這個類只是對MVC配置起效。(汗!!!!!!),咱們加過濾器的代碼要加入到webapi的配置而非mvc的配置,so 代碼要這麼寫。blog
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "push.api.v1", routeTemplate: "v1/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Filters.Add(new PushFilter()); } }