十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
前面的篇幅中,了解到了控制器的生成的過程以及在生成的過程中的各種注入點(diǎn),按照常理來說篇幅應(yīng)該到了講解控制器內(nèi)部的執(zhí)行過程以及模型綁定、驗(yàn)證這些知識(shí)了。但是呢,在MVC框架中提供了一種機(jī)制在控制器方法執(zhí)行之前我們還可以通過這種機(jī)制來做一些橫向切面的操作,這種機(jī)制的實(shí)現(xiàn)就是過濾器了,在本篇和后續(xù)的篇幅中將會(huì)對(duì)幾種過濾器做一番講解,并且會(huì)對(duì)過濾器在框架中的一個(gè)執(zhí)行過程進(jìn)行粗略的講解。
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(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ù):18982081108過濾器在系統(tǒng)框架中的整體對(duì)象模型
IAuthorizationFilter授權(quán)認(rèn)證過濾器的執(zhí)行過程
使用IAuthorizationFilter過濾器
IActionFilter行為過濾器的執(zhí)行過程
自定義實(shí)現(xiàn)IActionFilter行為過濾器
異常過濾器的使用
我們?cè)讷@得控制器工廠生成的控制器后,執(zhí)行某些控制器行為之前,總是要驗(yàn)證一些數(shù)據(jù)或者是請(qǐng)求信息什么的,這里就要用到過濾器的機(jī)制了,而在框架中過濾器是怎么運(yùn)轉(zhuǎn)的,通過本小節(jié)的學(xué)習(xí)會(huì)讓你有個(gè)大概的了解。
現(xiàn)在我們切入主題來講解一下在MVC框架中的過濾器。
圖1
如上圖所示的這樣,在控制器執(zhí)行的時(shí)候會(huì)調(diào)用ControllerActionInvoker類型的InvokeAction()方法,而在InvokeAction()方法中,框架會(huì)默認(rèn)的生成控制器描述對(duì)象ControllerDescriptor和控制器行為描述對(duì)象ActionDescriptor,這兩種類型的對(duì)象都是對(duì)當(dāng)前的控制器和所要請(qǐng)求的控制器方法信息的封裝,這個(gè)知識(shí)點(diǎn)我們會(huì)在后續(xù)的篇幅中講到,這里只須了解一下,忽略它們的生成過程。參照如下圖:
圖2
按照InvokeAction()方法的執(zhí)行流程,到了生成FilterInfo類型的時(shí)候,我們都知道MVC框架給我們提供了四種過濾器,哪四種后面一一介紹,那么FilterInfo類型是干什么的呢?來看一下它的對(duì)象結(jié)構(gòu):
1 //封裝有關(guān)可用的操作篩選器的信息。 2 public class FilterInfo 3 { 4 public FilterInfo(); 5 public FilterInfo(IEnumerablefilters); 6 public IList ActionFilters { get; } 7 public IList AuthorizationFilters { get; } 8 public IList ExceptionFilters { get; } 9 public IList ResultFilters { get; } 10 }
它的內(nèi)部有著四種過濾器集合類型的屬性,并且有個(gè)構(gòu)造函數(shù)是接收IEnumerable
我們來看一下Filter對(duì)象的結(jié)構(gòu):
1 // 表示一個(gè)元數(shù)據(jù)類,它包含對(duì)一個(gè)或多個(gè)篩選器接口的實(shí)現(xiàn)、篩選器順序和篩選器范圍的引用。 2 public class Filter 3 { 4 public const int DefaultOrder = -1; 5 public Filter(object instance, FilterScope scope, int? order); 6 7 public object Instance { get; protected set; } 8 public int Order { get; protected set; } 9 public FilterScope Scope { get; protected set; } 10 }
看到這里有可能有的朋友不明白這個(gè)對(duì)象,具體怎么表示?因?yàn)樵獢?shù)據(jù)編程模式很少見,這里我給大家舉個(gè)例子,一看就明白了:
1 [Authorize(Order=1)] 2 public class DemoController : Controller 3 { 4 …… 5 }
上面的這個(gè)列子則會(huì)在系統(tǒng)生成的時(shí)候生成一個(gè)Filter類型的對(duì)象,并且賦值Order等于1,而Filter類型中的Instance屬性則是對(duì)上述例子中的Authorize類型實(shí)例引用,這就是元數(shù)據(jù)描述對(duì)象,當(dāng)然了講的不是太詳細(xì),能讓大家明白就行了,Authorize類型的具體使用在下一篇中會(huì)有講到。
現(xiàn)在我們回歸主題,如圖2中所表示的那樣,IEnumerable
先是調(diào)用ControllerActionInvoker類型中的GetFilters()方法,我們看到方法的參數(shù)類型為控制器參數(shù)上下文對(duì)象和控制器行為元數(shù)據(jù)描述對(duì)象,這兩個(gè)對(duì)象就夠了,它們中包含的信息已經(jīng)很多了,在ControllerActionInvoker的GetFilters()方法內(nèi)部調(diào)用FilterProviderCollection類型的GetFilters(),和上面所述的類型方法簽名一樣,只不過返回類型有差異而已,而真正的根據(jù)參數(shù)執(zhí)行生成Filter類型的對(duì)象是實(shí)現(xiàn)了IFilterProvider類型的對(duì)象,
看一下IFilterProvider類型的結(jié)構(gòu):
1 // 提供用于查找篩選器的接口。 2 public interface IFilterProvider 3 { 4 IEnumerableGetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor); 5 }
而這個(gè)對(duì)象是可以從外部注入進(jìn)來的,在控制器(三)中提到過的,通過實(shí)現(xiàn)IDependencyResolver類型,而在框架中也會(huì)默認(rèn)的實(shí)現(xiàn)一個(gè)(只是我通過反編譯工具沒看到,顯示的是錯(cuò)誤信息,表示很郁悶,后文中就叫它為默認(rèn)實(shí)現(xiàn))。在FilterProviderCollection類型的GetFilters()中,會(huì)通過默認(rèn)實(shí)現(xiàn)來得到當(dāng)前請(qǐng)求的行為上的所有過濾器元數(shù)據(jù)描述對(duì)象,并且進(jìn)行排序、驗(yàn)證,這里就不多敘述了。然后返回IEnumerable
圖3
先來看一下IAuthorizationFilter類型的定義:
1 public interface IAuthorizationFilter 2 { 3 // 摘要: 4 // 在需要授權(quán)時(shí)調(diào)用。 5 // 6 // 參數(shù): 7 // filterContext: 8 // 篩選器上下文。 9 void OnAuthorization(AuthorizationContext filterContext); 10 }
看到如上的定義,再看圖3IAuthorizationFilter類型的執(zhí)行過程一目了然,根據(jù)ControllerContext控制器參數(shù)上下文對(duì)象和控制器行為據(jù)描述對(duì)象actionDescriptor生成AuthorizationContext授權(quán)認(rèn)證過濾器參數(shù)上下文對(duì)象,并且會(huì)遍歷FilterInfo類型中的AuthorizationFilters屬性,挨個(gè)的去執(zhí)行我們定義的過濾器。
本篇的內(nèi)容就講到這里,下個(gè)篇幅中會(huì)講到IAuthorizationFilter類型的使用
另外有需要云服務(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)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。