首先為什么說這是一個坑,是因為我們在webapi中使用filter的時候也許會先百度一下,好吧,挖坑的來了,我看了好幾篇文章寫的是使用System.Web.Mvc.Filters.ActionFilterAttribute。
然后開始痛苦的調試,發現這個過濾器永遠調不進來(windows azure mobile services除外)。then.... 還是Google吧 !
痛苦后才懂,原來不是這么一回事,ActionFilterAttribute 有2個不同的版本,一個在System.Web.Mvc空間下,另外一個則在System.Web.Http.Filters命名空間下。他們有何區別?
The System.Web.Http one is for Web API; the System.Web.Mvc one is for previous MVC versions.
You can see from the source that the Web API version has several differences.
好吧,原來System.Web.Mvc.Filters.ActionFilterAttribute是給mvc用的,我們要用System.Web.Http.Filters下的,知道這樣了 就開始了改寫過程....,運行調試,發現異常!!!
先看下異常代碼:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new PushFilter()); } }
“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 代碼要這么寫。
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()); } }
運行調試,ok,success!