ASP.NETMVC過濾器(三)

 ASP.NET MVC 過濾器(三)

前言

本篇講解行為過濾器的執(zhí)行過程,過濾器實現(xiàn)、使用方式有AOP的意思,可以通過學習了解過濾器在框架中的執(zhí)行過程從而獲得一些AOP方面的知識(在順序執(zhí)行的過程中,這種編程模式就是橫向的插入點),言歸正傳,我們還是以學習過濾器為主。對于IAuthorizationFilter授權認證過濾器的使用篇幅,我知道怎么用但是寫不出來,里面包含知識點很多,功底尚淺寫了一半又給刪掉了,寧愿不發(fā)也不能坑人,在后面的學習中假使我可以掌握了,一定會及時的寫出來跟大家分享。這個目錄也空在這也算是給自己的一個提醒吧。

為滕州等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及滕州網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站制作、做網(wǎng)站、滕州網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

 

ASP.NET MVC過濾器

  • 過濾器在系統(tǒng)框架中的整體對象模型

  • IAuthorizationFilter授權認證過濾器的執(zhí)行過程

  • 使用IAuthorizationFilter過濾器

  • IActionFilter行為過濾器的執(zhí)行過程

  • 自定義實現(xiàn)IActionFilter行為過濾器

  • 異常過濾器的使用

 

IActionFilter行為過濾器的執(zhí)行過程

我們直接進入主題,這里的執(zhí)行過程還是接著過濾器(一)中的部分,我們看下執(zhí)行過程的示意圖:

圖1

ASP.NET MVC 過濾器(三)

如圖1所示,就是整個的一個執(zhí)行過程,圖太大拆開來看,這樣比較細致一點(這里捎帶一句,后面許多部分的內(nèi)容都都包含在這個示意圖里,比如說Model元數(shù)據(jù)、Model綁定和Model驗證)。

圖2

ASP.NET MVC 過濾器(三)

首先是調(diào)用了ControllerActionInvoker類型的GetParameterValues()方法,GetParameterValues()方法的參數(shù)是控制器上下文參數(shù)對象【ControllerContext類型】和控制器方法描述對象【ActionDescriptor類型】,然后在此方法中會根據(jù)ActionDescriptor類型的參數(shù)來調(diào)用GetParameters()方法獲取到控制器方法參數(shù)的描述對象【ParameterDescriptor類型】的集合,這里對ParameterDescriptor類型不做過多的講解,只需了解它是包含了控制器方法參數(shù)的一些信息,比如說參數(shù)名稱、參數(shù)類型等等。

圖3

ASP.NET MVC 過濾器(三)

從圖2中所示的那樣,獲取到了ParameterDescriptor類型的集合后,便會遍歷此集合并且調(diào)用圖3中所示的ControllerActionInvoker類型的GetParameterValue()方法【這里注意一下跟上面的圖2所示的方法是不同的】,調(diào)用GetParameterValue()方法的目的是生成一個鍵值隊類型的對象【紅色箭頭所指】,鍵值隊中的鍵表示參數(shù)名稱,值則為參數(shù)的值,而生成的過程是:首先MVC框架會調(diào)用用戶自定義的模型綁定器(如果有自定義的)【實現(xiàn)了IModelBinder接口的類型】,并且調(diào)用自定義模型綁定器的方法以此來獲取控制器方法參數(shù)的參數(shù)值,如果沒有發(fā)現(xiàn)自定義的模型綁定器,則會調(diào)用默認的Model綁定器進行參數(shù)綁定,如果沒有匹配的類型返回一個默認值ParameterDescriptor.DefaultValue】。(關于Model綁定器內(nèi)容后續(xù)系列會有講解)

圖4

ASP.NET MVC 過濾器(三)

有了參數(shù)值信息的鍵值隊過后,接著調(diào)用ControllerActionInvoker類型的InvokeActionMethodWithFilters()方法,在此方法會生成兩種參數(shù)類型以便由ControllerActionInvoker類型的InvokeActionMethodFilter()方法調(diào)用,下面我們先講解這兩種參數(shù)類型:

  1. ActionExecutingContext

  2. Func<ActionExecutedContext>

第一個參數(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類型,并且包含著一些信息的引用,這便是可以在控制器方法執(zhí)行之前執(zhí)行自己的一些自定義操作。

第二個參數(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類型的區(qū)別在于前者多了兩個屬性一個是用于保存異常信息的,另一個屬性是用來設置是否處理了異常,這個會在異常過濾器篇幅中講解。

切回主題,大概知道這兩種類型的定義就行了,說到Func<ActionExecutedContext>類型的參數(shù),在MVC框架中默認的設置了Lambda表達式,并且對返回類型中的Result屬性又設置了一個表達式調(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)用執(zhí)行最后的ControllerActionInvoker類型的InvokeActionMethodFilter()方法,而其中的IActionFilter類型的參數(shù)則有在前面篇幅中講到的FilterInfo類型中的ActionFilters屬性提供,并且是遍歷執(zhí)行的,最后可以看到在InvokeActionMethodFilter()方法的內(nèi)部首先是由IActionFilter類型的參數(shù)調(diào)用了OnActionExecuting()方法,然后執(zhí)行Func<ActionExecutedContext>類型的參數(shù),因為上面說到的,這個委托類型的參數(shù)已經(jīng)定義好了默認的執(zhí)行方式,是執(zhí)行ControllerActionInvoker類型的中的InvokeActionMethod()方法,在此方法執(zhí)行后在執(zhí)行IActionFilter類型的OnActionExecuted()方法,并且最終的結(jié)果值返回到了ActionExecutedContext類型的Result屬性中。

最后我們看一下IActionFilter類型的結(jié)構(gòu)定義:

 1     public interface IActionFilter
 2     {
 3         // 摘要:
 4         //     在執(zhí)行操作方法后調(diào)用。
 5         //
 6         // 參數(shù):
 7         //   filterContext:
 8         //     篩選器上下文。
 9         void OnActionExecuted(ActionExecutedContext filterContext);
10         //
11         // 摘要:
12         //     在執(zhí)行操作方法之前調(diào)用。
13         //
14         // 參數(shù):
15         //   filterContext:
16         //     篩選器上下文。
17         void OnActionExecuting(ActionExecutingContext filterContext);
18     }

行為過濾器大概的執(zhí)行過程講解完畢了,下一篇會對這種類型的過濾器的應用作大概講解。

 

 

文章標題:ASP.NETMVC過濾器(三)
URL鏈接:http://bm7419.com/article44/psojhe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站改版靜態(tài)網(wǎng)站、網(wǎng)站導航、Google、面包屑導航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司