ASP.NET MVC 过滤器(三)
?ASP.NET MVC 過濾器(三)
前言
本篇解說行為過濾器的運行過程,過濾器實現(xiàn)、使用方式有AOP的意思。能夠通過學(xué)習(xí)了解過濾器在框架中的運行過程從而獲得一些AOP方面的知識(在順序運行的過程中,這樣的編程模式就是橫向的插入點),言歸正傳,我們還是以學(xué)習(xí)過濾器為主。對于IAuthorizationFilter授權(quán)認證過濾器的使用篇幅。我知道怎么用可是寫不出來,里面包括知識點非常多。功底尚淺寫了一半又給刪掉了。寧愿不發(fā)也不能坑人,在后面的學(xué)習(xí)中假使我能夠掌握了,一定會及時的寫出來跟大家分享。這個文件夾也空在這也算是給自己的一個提醒吧。
?
ASP.NET MVC過濾器
- 過濾器在系統(tǒng)框架中的總體對象模型
- IAuthorizationFilter授權(quán)認證過濾器的運行過程
- 使用IAuthorizationFilter過濾器
- IActionFilter行為過濾器的運行過程
- 自己定義實現(xiàn)IActionFilter行為過濾器
- 異常過濾器的使用
?
IActionFilter行為過濾器的運行過程
我們直接進入主題。這里的運行過程還是接著過濾器(一)中的部分,我們看下運行過程的示意圖:
圖1
如圖1所看到的,就是整個的一個運行過程,圖太大拆開來看。這樣比較仔細一點(這里捎帶一句,后面很多部分的內(nèi)容都都包括在這個示意圖里。比方說Model元數(shù)據(jù)、Model綁定和Model驗證)。
圖2
首先是調(diào)用了ControllerActionInvoker類型的GetParameterValues()方法,GetParameterValues()方法的參數(shù)是控制器上下文參數(shù)對象【ControllerContext類型】和控制器方法描寫敘述對象【ActionDescriptor類型】。然后在此方法中會依據(jù)ActionDescriptor類型的參數(shù)來調(diào)用GetParameters()方法獲取到控制器方法參數(shù)的描寫敘述對象【ParameterDescriptor類型】的集合,這里對ParameterDescriptor類型不做過多的解說,僅僅需了解它是包括了控制器方法參數(shù)的一些信息,比方說參數(shù)名稱、參數(shù)類型等等。
圖3
從圖2中所看到的的那樣,獲取到了ParameterDescriptor類型的集合后,便會遍歷此集合而且調(diào)用圖3中所看到的的ControllerActionInvoker類型的GetParameterValue()方法【這里注意一下跟上面的圖2所看到的的方法是不同的】,調(diào)用GetParameterValue()方法的目的是生成一個鍵值隊類型的對象【紅色箭頭所指】,鍵值隊中的鍵表示參數(shù)名稱,值則為參數(shù)的值,而生成的過程是:首先MVC框架會調(diào)用用戶自己定義的模型綁定器(假設(shè)有自己定義的)【實現(xiàn)了IModelBinder接口的類型】,而且調(diào)用自己定義模型綁定器的方法以此來獲取控制器方法參數(shù)的參數(shù)值,假設(shè)沒有發(fā)現(xiàn)自己定義的模型綁定器,則會調(diào)用默認的Model綁定器進行參數(shù)綁定。假設(shè)沒有匹配的類型返回一個默認值【ParameterDescriptor.DefaultValue】。(關(guān)于Model綁定器內(nèi)容興許系列會有解說)
圖4
有了參數(shù)值信息的鍵值隊過后,接著調(diào)用ControllerActionInvoker類型的InvokeActionMethodWithFilters()方法,在此方法會生成兩種參數(shù)類型以便由ControllerActionInvoker類型的InvokeActionMethodFilter()方法調(diào)用,以下我們先解說這兩種參數(shù)類型:
第一個參數(shù)
1 public class ActionExecutingContext : ControllerContext 2 { 3 public ActionExecutingContext(); 4 public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> actionParameters); 5 6 public virtual ActionDescriptor ActionDescriptor { get; set; } 7 public virtual IDictionary<string, object> ActionParameters { get; set; } 8 public ActionResult Result { get; set; } 9 }在上面類型的定義中,我們了解到ActionExecutingContext類型繼承至ControllerContext類型,而且包括著一些信息的引用。這便是能夠在控制器方法運行之前運行自己的一些自己定義操作。
第二個參數(shù)
1 public class ActionExecutedContext : ControllerContext 2 { 3 4 public ActionExecutedContext(); 5 public ActionExecutedContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, bool canceled, Exception exception); 6 7 public virtual ActionDescriptor ActionDescriptor { get; set; } 8 public virtual bool Canceled { get; set; } 9 public virtual Exception Exception { get; set; } 10 public bool ExceptionHandled { get; set; } 11 public ActionResult Result { get; set; } 12 }ActionExecutedContext類型跟ActionExecutingContext類型的差別在于前者多了兩個屬性一個是用于保存異常信息的,還有一個屬性是用來設(shè)置是否處理了異常,這個會在異常過濾器篇幅中解說。
切回主題。大概知道這兩種類型的定義即可了,說到Func<ActionExecutedContext>類型的參數(shù)。在MVC框架中默認的設(shè)置了Lambda表達式。而且對返回類型中的Result屬性又設(shè)置了一個表達式調(diào)用的是ControllerActionInvoker類型的InvokeActionMethod()方法,這種方法后面會講到。
我們看一下表達式的定義,不然有點混亂:
1 Func<ActionExecutedContext> seed = () => 2 { 3 new ActionExecutedContext(controllerContext,actionDescriptor, false,null) 4 { 5 Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters) 6 } 7 };上述的這些參數(shù)都準備完成后,能夠調(diào)用運行最后的ControllerActionInvoker類型的InvokeActionMethodFilter()方法。而當中的IActionFilter類型的參數(shù)則有在前面篇幅中講到的FilterInfo類型中的ActionFilters屬性提供。而且是遍歷運行的,最后能夠看到在InvokeActionMethodFilter()方法的內(nèi)部首先是由IActionFilter類型的參數(shù)調(diào)用了OnActionExecuting()方法,然后運行Func<ActionExecutedContext>類型的參數(shù),由于上面說到的。這個托付類型的參數(shù)已經(jīng)定義好了默認的運行方式。是運行ControllerActionInvoker類型的中的InvokeActionMethod()方法。在此方法運行后在運行IActionFilter類型的OnActionExecuted()方法,而且終于的結(jié)果值返回到了ActionExecutedContext類型的Result屬性中。
最后我們看一下IActionFilter類型的結(jié)構(gòu)定義:
1 public interface IActionFilter 2 { 3 // 摘要: 4 // 在運行操作方法后調(diào)用。 5 // 6 // 參數(shù): 7 // filterContext: 8 // 篩選器上下文。 9 void OnActionExecuted(ActionExecutedContext filterContext); 10 // 11 // 摘要: 12 // 在運行操作方法之前調(diào)用。 13 // 14 // 參數(shù): 15 // filterContext: 16 // 篩選器上下文。 17 void OnActionExecuting(ActionExecutingContext filterContext); 18 }行為過濾器大概的運行過程解說完成了,下一篇會對這樣的類型的過濾器的應(yīng)用作大概解說。
?
?
?
?
?
作者:金源
出處:http://blog.csdn.net/jinyuan0829
本文版權(quán)歸作者和CSDN共同擁有。歡迎轉(zhuǎn)載。但未經(jīng)作者允許必須保留此段聲明,且在文章頁面
轉(zhuǎn)載于:https://www.cnblogs.com/ldxsuanfa/p/10036180.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC 过滤器(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4-7 集合
- 下一篇: spring 04-Spring框架依赖