第五节:WebApi的三大过滤器
一. 基本說(shuō)明?
?1. 簡(jiǎn)介:
WebApi下的過(guò)濾器和MVC下的過(guò)濾器有一些區(qū)別,首先我們要注意的是通常建WebApi項(xiàng)目時(shí),會(huì)自動(dòng)把MVC的程序集也引入進(jìn)來(lái),所以我們?cè)谑褂肳ebApi下的過(guò)濾器的時(shí)候,要引入“ System.Web.Http”這個(gè)程序集,而不是MVC的“System.Web.MVC”。
PS:關(guān)于WebApi下的過(guò)濾器在的作用位置和使用方法以及執(zhí)行順序,均和MVC下的過(guò)濾器相似,詳見(jiàn):https://www.cnblogs.com/yaopengfei/p/7910763.html
2. 與MVC過(guò)濾器的區(qū)別
由于WebApi只關(guān)注于方法,所以WebApi下沒(méi)有結(jié)果過(guò)濾器, 詳細(xì)分析: ActionFilterAttribute這個(gè)類(lèi)并沒(méi)有繼承IResultFilter這個(gè)接口,只繼承了IActionFilter這個(gè)接口,重寫(xiě)了OnActionExecuted和OnActionExecuting兩個(gè)方法(包括對(duì)應(yīng)的異步方法),并沒(méi)有重寫(xiě):OnResultExecuted和OnResultExecuting兩個(gè)方法。
3. 過(guò)濾器的重寫(xiě)方法的執(zhí)行順序:
OnAuthorization→OnActionExecuting-> Action方法執(zhí)行 ->OnActionExecuted
二. 三大過(guò)濾器
1. 授權(quán)過(guò)濾器
繼承AuthorizeAttribute類(lèi),重寫(xiě)OnAuthorization方法,eg:MyAuthorize類(lèi).
1 public class MyAuthorize : AuthorizeAttribute2 {3 public override void OnAuthorization(HttpActionContext actionContext)4 {5 6 //1.如果保留如下代碼,則會(huì)運(yùn)行.net framework定義好的身份驗(yàn)證,如果希望自定義身份驗(yàn)證,則刪除如下代碼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("身份驗(yàn)證過(guò)濾器作用于" + controllerName + "控制器下的" + actionName + "方法"); 13 } 14 }2. 行為過(guò)濾器
繼承ActionFilterAttribute,重寫(xiě)OnActionExecuting和OnActionExecuted方法,eg:MyAction類(lèi)
1 public class MyAction: ActionFilterAttribute2 {3 /// <summary>4 /// 在Action方法運(yùn)行之前調(diào)用5 /// </summary>6 /// <param name="actionContext"></param>7 public override void OnActionExecuting(HttpActionContext actionContext)8 {9 10 //1.如果保留如下代碼,則會(huì)運(yùn)行.net framework定義好的行為驗(yàn)證,如果希望自定義行為驗(yàn)證,則刪除如下代碼 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("行為過(guò)濾器OnActionExecuting作用于" + controllerName + "控制器下的" + actionName + "方法運(yùn)行之前"); 17 } 18 19 /// <summary> 20 /// 在Action方法運(yùn)行之后調(diào)用 21 /// </summary> 22 /// <param name="actionExecutedContext"></param> 23 public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 24 { 25 base.OnActionExecuted(actionExecutedContext); 26 27 //1.如果保留如下代碼,則會(huì)運(yùn)行.net framework定義好的行為驗(yàn)證,如果希望自定義行為驗(yàn)證,則刪除如下代碼 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("行為過(guò)濾器OnActionExecuted作用于" + controllerName + "控制器下的" + actionName + "方法運(yùn)行之后"); 34 } 35 }測(cè)試:用PostMan請(qǐng)求下面的CheckLogin方法,可以驗(yàn)證上面的執(zhí)行順序:OnAuthorization→OnActionExecuting-> Action方法執(zhí)行 ->OnActionExecuted
3.異常個(gè)過(guò)濾器
實(shí)現(xiàn)IExceptionFilter接口,繼承FilterAttribute類(lèi)(能以特性的形式作用),eg:MyException類(lèi).
?
1 /// <summary>2 /// 異常過(guò)濾器3 /// </summary>4 public class MyException : FilterAttribute,IExceptionFilter5 {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.對(duì)獲取的異常信息進(jìn)行處理 16 using (StreamWriter writer = File.AppendText("d:/err.txt")) 17 { 18 await writer.WriteLineAsync(errorMsg); 19 } 20 21 } 22 }測(cè)試:?用PostMan請(qǐng)求下面的CheckLogin2方法,手動(dòng)制造錯(cuò)誤,會(huì)進(jìn)入異常過(guò)濾器中,獲取錯(cuò)誤,進(jìn)行相應(yīng)的處理.
?
總結(jié)
以上是生活随笔為你收集整理的第五节:WebApi的三大过滤器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 40访问者模式(Visitor Patt
- 下一篇: 2023年GDP总量预测,美国24。9万