本篇講解行為過濾器的執(zhí)行過程,過濾器實(shí)現(xiàn)、使用方式有AOP的意思,可以通過學(xué)習(xí)了解過濾器在框架中的執(zhí)行過程從而獲得一些AOP方面的知識(shí)(在順序執(zhí)行的過程中,這種編程模式就是橫向的插入點(diǎn)),言歸正傳,我們還是以學(xué)習(xí)過濾器為主。對于IAuthorizationFilter授權(quán)認(rèn)證過濾器的使用篇幅,我知道怎么用但是寫不出來,里面包含知識(shí)點(diǎn)很多,功底尚淺寫了一半又給刪掉了,寧愿不發(fā)也不能坑人,在后面的學(xué)習(xí)中假使我可以掌握了,一定會(huì)及時(shí)的寫出來跟大家分享。這個(gè)目錄也空在這也算是給自己的一個(gè)提醒吧。
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)慈利,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575過濾器在系統(tǒng)框架中的整體對象模型
IAuthorizationFilter授權(quán)認(rèn)證過濾器的執(zhí)行過程
使用IAuthorizationFilter過濾器
IActionFilter行為過濾器的執(zhí)行過程
自定義實(shí)現(xiàn)IActionFilter行為過濾器
異常過濾器的使用
我們直接進(jìn)入主題,這里的執(zhí)行過程還是接著過濾器(一)中的部分,我們看下執(zhí)行過程的示意圖:
圖1
如圖1所示,就是整個(gè)的一個(gè)執(zhí)行過程,圖太大拆開來看,這樣比較細(xì)致一點(diǎn)(這里捎帶一句,后面許多部分的內(nèi)容都都包含在這個(gè)示意圖里,比如說Model元數(shù)據(jù)、Model綁定和Model驗(yàn)證)。
圖2
首先是調(diào)用了ControllerActionInvoker類型的GetParameterValues()方法,GetParameterValues()方法的參數(shù)是控制器上下文參數(shù)對象【ControllerContext類型】和控制器方法描述對象【ActionDescriptor類型】,然后在此方法中會(huì)根據(jù)ActionDescriptor類型的參數(shù)來調(diào)用GetParameters()方法獲取到控制器方法參數(shù)的描述對象【ParameterDescriptor類型】的集合,這里對ParameterDescriptor類型不做過多的講解,只需了解它是包含了控制器方法參數(shù)的一些信息,比如說參數(shù)名稱、參數(shù)類型等等。
圖3
從圖2中所示的那樣,獲取到了ParameterDescriptor類型的集合后,便會(huì)遍歷此集合并且調(diào)用圖3中所示的ControllerActionInvoker類型的GetParameterValue()方法【這里注意一下跟上面的圖2所示的方法是不同的】,調(diào)用GetParameterValue()方法的目的是生成一個(gè)鍵值隊(duì)類型的對象【紅色箭頭所指】,鍵值隊(duì)中的鍵表示參數(shù)名稱,值則為參數(shù)的值,而生成的過程是:首先MVC框架會(huì)調(diào)用用戶自定義的模型綁定器(如果有自定義的)【實(shí)現(xiàn)了IModelBinder接口的類型】,并且調(diào)用自定義模型綁定器的方法以此來獲取控制器方法參數(shù)的參數(shù)值,如果沒有發(fā)現(xiàn)自定義的模型綁定器,則會(huì)調(diào)用默認(rèn)的Model綁定器進(jìn)行參數(shù)綁定,如果沒有匹配的類型返回一個(gè)默認(rèn)值【ParameterDescriptor.DefaultValue】。(關(guān)于Model綁定器內(nèi)容后續(xù)系列會(huì)有講解)
圖4
有了參數(shù)值信息的鍵值隊(duì)過后,接著調(diào)用ControllerActionInvoker類型的InvokeActionMethodWithFilters()方法,在此方法會(huì)生成兩種參數(shù)類型以便由ControllerActionInvoker類型的InvokeActionMethodFilter()方法調(diào)用,下面我們先講解這兩種參數(shù)類型:
ActionExecutingContext
Func<ActionExecutedContext>
第一個(gè)參數(shù)
1 public class ActionExecutingContext : ControllerContext 2 { 3 public ActionExecutingContext(); 4 public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionaryactionParameters); 5 6 public virtual ActionDescriptor ActionDescriptor { get; set; } 7 public virtual IDictionary ActionParameters { get; set; } 8 public ActionResult Result { get; set; } 9 }
在上面類型的定義中,我們了解到ActionExecutingContext類型繼承至ControllerContext類型,并且包含著一些信息的引用,這便是可以在控制器方法執(zhí)行之前執(zhí)行自己的一些自定義操作。
第二個(gè)參數(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ū)別在于前者多了兩個(gè)屬性一個(gè)是用于保存異常信息的,另一個(gè)屬性是用來設(shè)置是否處理了異常,這個(gè)會(huì)在異常過濾器篇幅中講解。
切回主題,大概知道這兩種類型的定義就行了,說到Func<ActionExecutedContext>類型的參數(shù),在MVC框架中默認(rèn)的設(shè)置了Lambda表達(dá)式,并且對返回類型中的Result屬性又設(shè)置了一個(gè)表達(dá)式調(diào)用的是ControllerActionInvoker類型的InvokeActionMethod()方法,這個(gè)方法后面會(huì)講到。我們看一下表達(dá)式的定義,不然有點(diǎn)混亂:
1 Funcseed = () => 2 { 3 new ActionExecutedContext(controllerContext,actionDescriptor, false,null) 4 { 5 Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters) 6 } 7 };
上述的這些參數(shù)都準(zhǔn)備完畢后,可以調(diào)用執(zhí)行最后的ControllerActionInvoker類型的InvokeActionMethodFilter()方法,而其中的IActionFilter類型的參數(shù)則有在前面篇幅中講到的FilterInfo類型中的ActionFilters屬性提供,并且是遍歷執(zhí)行的,最后可以看到在InvokeActionMethodFilter()方法的內(nèi)部首先是由IActionFilter類型的參數(shù)調(diào)用了OnActionExecuting()方法,然后執(zhí)行Func<ActionExecutedContext>類型的參數(shù),因?yàn)樯厦嬲f到的,這個(gè)委托類型的參數(shù)已經(jīng)定義好了默認(rèn)的執(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í)行過程講解完畢了,下一篇會(huì)對這種類型的過濾器的應(yīng)用作大概講解。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。