隕石坑之webapi使用filter

   首先爲何說這是一個坑,是由於咱們在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());
        }
    }
相關文章
相關標籤/搜索