第五節:WebApi的三大過濾器


一. 基本說明 

 1. 簡介:

  WebApi下的過濾器和MVC下的過濾器有一些區別,首先我們要注意的是通常建WebApi項目時,會自動把MVC的程序集也引入進來,所以我們在使用WebApi下的過濾器的時候,要引入“ System.Web.Http”這個程序集,而不是MVC的“System.Web.MVC”。

PS:關於WebApi下的過濾器在的作用位置和使用方法以及執行順序,均和MVC下的過濾器相似,詳見:https://www.cnblogs.com/yaopengfei/p/7910763.html

2. 與MVC過濾器的區別

  由於WebApi只關注於方法,所以WebApi下沒有結果過濾器, 詳細分析: ActionFilterAttribute這個類並沒有繼承IResultFilter這個接口,只繼承了IActionFilter這個接口,重寫了OnActionExecuted和OnActionExecuting兩個方法(包括對應的異步方法),並沒有重寫:OnResultExecuted和OnResultExecuting兩個方法。

3. 過濾器的重寫方法的執行順序:

  OnAuthorization→OnActionExecuting-> Action方法執行 ->OnActionExecuted

二. 三大過濾器

1. 授權過濾器

  繼承AuthorizeAttribute類,重寫OnAuthorization方法,eg:MyAuthorize類.

 1  public class MyAuthorize : AuthorizeAttribute
 2     {
 3         public override void OnAuthorization(HttpActionContext actionContext)
 4         {
 5 
 6             //1.如果保留如下代碼,則會運行.net framework定義好的身份驗證,如果希望自定義身份驗證,則刪除如下代碼
 7             // base.OnAuthorization(actionContext);
 8 
 9             //2.獲取控制器作用的Controller和action的名字
10             string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
11             string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
12             HttpContext.Current.Response.Write("身份驗證過濾器作用於" + controllerName + "控制器下的" + actionName + "方法");
13         }
14     }

2. 行為過濾器

  繼承ActionFilterAttribute,重寫OnActionExecuting和OnActionExecuted方法,eg:MyAction類

 1  public class MyAction: ActionFilterAttribute
 2     {
 3         /// <summary>
 4         /// 在Action方法運行之前調用
 5         /// </summary>
 6         /// <param name="actionContext"></param>
 7         public override void OnActionExecuting(HttpActionContext actionContext)
 8         {
 9 
10             //1.如果保留如下代碼,則會運行.net framework定義好的行為驗證,如果希望自定義行為驗證,則刪除如下代碼
11             // base.OnActionExecuting(actionContext);
12 
13             //2.獲取控制器作用的Controller和action的名字
14             string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
15             string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
16             HttpContext.Current.Response.Write("行為過濾器OnActionExecuting作用於" + controllerName + "控制器下的" + actionName + "方法運行之前");
17         }
18 
19         /// <summary>
20         /// 在Action方法運行之后調用
21         /// </summary>
22         /// <param name="actionExecutedContext"></param>
23         public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
24         {
25             base.OnActionExecuted(actionExecutedContext);
26 
27             //1.如果保留如下代碼,則會運行.net framework定義好的行為驗證,如果希望自定義行為驗證,則刪除如下代碼
28             // base.OnActionExecuted(actionExecutedContext);
29 
30             //2.獲取控制器作用的Controller和action的名字
31             string controllerName = actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName.ToLower();
32             string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName.ToLower();
33             HttpContext.Current.Response.Write("行為過濾器OnActionExecuted作用於" + controllerName + "控制器下的" + actionName + "方法運行之后");
34         }    
35     }

  測試:用PostMan請求下面的CheckLogin方法,可以驗證上面的執行順序:OnAuthorization→OnActionExecuting-> Action方法執行 ->OnActionExecuted

3.異常個過濾器

  實現IExceptionFilter接口,繼承FilterAttribute類(能以特性的形式作用),eg:MyException類.

 1 /// <summary>
 2     /// 異常過濾器
 3     /// </summary>
 4     public class MyException : FilterAttribute,IExceptionFilter
 5     {
 6         //public bool AllowMultiple => throw new NotImplementedException();
 7 
 8         public async Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
 9         {
10             //throw new NotImplementedException();
11 
12             //1.獲取異常信息
13             string errorMsg = actionExecutedContext.Exception.ToString();
14       
15             //2.對獲取的異常信息進行處理
16             using (StreamWriter writer = File.AppendText("d:/err.txt"))
17             {
18                 await writer.WriteLineAsync(errorMsg);
19             }
20 
21         }
22     }

  測試: 用PostMan請求下面的CheckLogin2方法,手動制造錯誤,會進入異常過濾器中,獲取錯誤,進行相應的處理.

 

 

 

 

 

  

 

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

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



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