一. 基本說明
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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。