隕石坑之webapi使用filter


   首先為什么說這是一個坑,是因為我們在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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM