西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開發(fā)ASP.NET → ASP.Net MVC不在多個(gè)Action上寫同樣的FitlerAttribute

ASP.Net MVC不在多個(gè)Action上寫同樣的FitlerAttribute

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/12/8 21:26:52字體大。A-A+

作者:佚名點(diǎn)擊:130次評(píng)論:0次標(biāo)簽: 異常處理 Action執(zhí)行器 Controller

PeStudio編程輔助v8.42 綠色免費(fèi)版
  • 類型:編程輔助大。699KB語(yǔ)言:英文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載
 以AuthorizeAttribute這個(gè)Filter舉例,一個(gè)Controller有若干個(gè)Action,包括登錄的Action(如Login)。這時(shí)我們就不能將Authorize放在Controller簽名之上,不得不給除了Login這個(gè)Action之外的所有Action加上個(gè)Authorize——這也不是大不了的事情,我多寫幾個(gè)Authorize也覺(jué)得沒(méi)關(guān)系,或者我重新實(shí)現(xiàn)一個(gè)IAuthorizationFilter,在里面判斷如果是Login這個(gè)Action,就不進(jìn)行驗(yàn)證。

如果我想給所有Action注入一段html到頁(yè)面底部,我必須去修改Controller嗎?
如果我想動(dòng)態(tài)控制某個(gè)Action允許由哪些角色訪問(wèn),我通過(guò)修改Controller能實(shí)現(xiàn)嗎?
如果我想這時(shí)候控制的由哪些角色來(lái)訪問(wèn),需求改變時(shí)我想要控制由哪些用戶來(lái)訪問(wèn)呢?我還得去修改Controller嗎?或者增加或修改Filter嗎?

所以需求就出現(xiàn)了:能不能讓我集中管理這些Filter,并且控制的更靈活呢?能讓所有Controller和Action簽名上都干干凈凈的那就最好了。

那就把Filter放在一處集中管理,在Action或ActionResult等執(zhí)行Filter之前保證將需要的Filter準(zhǔn)備好就行了。

在解決問(wèn)題之前,先簡(jiǎn)單回顧一下Action執(zhí)行前后發(fā)生的事。

我們知道,在ASP.NET MVC中,每一次請(qǐng)求通常都定位到一個(gè)具體的Controller的Action中。
在默認(rèn)情況下,由Action執(zhí)行器ControllerActionInvoker類去控制Action的執(zhí)行(或不執(zhí)行),實(shí)際做事的是InvokeAction方法。
InvokeAction方法首先去查找Action(由FindAction方法),如果Action被找到了,會(huì)去檢索該Action擁有的Filter以及該Action所屬Controller的Filter(由GetFilters方法),將找到的所有Filter放入一個(gè)FilterInfo變量中,F(xiàn)ilterInfo中保存的Filter不完全是Action是自己的。然后先執(zhí)行找到的所有IAuthorizationFilter(由InvokeAuthorizationFilters方法)。當(dāng)然,在InvokeAuthorizationFilters方法中,只要有IAuthorizationFilter的ActionResult不為null就會(huì)返回不會(huì)執(zhí)行其他的了。 InvokeAction方法檢測(cè)執(zhí)行結(jié)果,如果ActionResult的確不為空,則執(zhí)行該Result,其他Filter就不管啦。 接著獲取要傳給Action的參數(shù)集(交給GetParameterValue方法),就執(zhí)行InvokeActionMethodWithFilters方法,方法名已經(jīng)足夠說(shuō)明它是干什么的了。如果一切正常,根據(jù)InvokeActionMethodWithFilters方法返回的結(jié)果去接著就執(zhí)行InvokeActionResultWithFilters方法。在執(zhí)行InvokeAuthorizationFilters一直到執(zhí)行InvokeActionResultWithFilters的這一整個(gè)過(guò)程中如果發(fā)生異常,則根據(jù)捕獲的異常執(zhí)行InvokeExceptionFilters進(jìn)行異常處理。

這里需要注意一點(diǎn):InvokeAction、GetFilters、InvokeAuthorizationFilters、GetParameterValue、InvokeActionMethodWithFilters、InvokeActionResultWithFilters、InvokeExceptionFilters等全是虛方法,除非有足夠的原因去繼承IActionInvoker重寫一個(gè)Action執(zhí)行器,否則重寫某些方法足夠擴(kuò)展。

甚至ControllerActionInvoker類本身,在ASP.NET MVC基礎(chǔ)架構(gòu)中也是可以替換的,怎么替換呢?繼承Controller類時(shí)重寫CreateActionInvoker方法就可以。

另外還可以在構(gòu)造Controller對(duì)象給它的ActionInvoker屬性賦值,這又怎么賦值?重寫DefaultControllerFactory創(chuàng)建Controller實(shí)例的GetControllerInstance方法。 然后在Applicaion_Start中設(shè)置新的ControllerFactor:
ControllerBuilder.Current.SetControllerFactory(new YourControllerFactory());

回到主題。 首先我們將Filter和Action的對(duì)應(yīng)關(guān)系(Filter和Controller的對(duì)應(yīng)關(guān)系在本文中暫不討論)存于一個(gè)集合中并緩存起來(lái)。

從找到Action到執(zhí)行InvokeAuthorizationFilters之前,必須將IAuthorizationFilter準(zhǔn)備好;從找到Action到執(zhí)行InvokeActionMethodWithFilters之前,必須將Action需要的IActionFilter準(zhǔn)備好;從找到Action到執(zhí)行InvokeActionResultWithFilters之前,必須將ActionResult需要的IResultFilter準(zhǔn)備好。異常發(fā)生InvokeExceptionFilters執(zhí)行之前,必須將IExceptionFilter準(zhǔn)備好。 基于以上幾點(diǎn),我們好像只能在FindAction方法和GetFilters方法之間選擇一個(gè)。當(dāng)然也就是只有GetFilters了。

在Filter方法中,我們根據(jù)當(dāng)前Action的特征(如方法名,或包括請(qǐng)求方式Get或Post)與Filter和Action對(duì)應(yīng)表。將匹配的Filter加進(jìn)FilterInfo變量中。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    第 2 樓 四川成都鐵通ADSL 網(wǎng)友 客人 發(fā)表于: 2011/7/21 13:15:23
    撒旦法撒旦法撒旦法第三方

    支持( 0 ) 蓋樓(回復(fù))

    第 1 樓 廣東廣州番禺電信 網(wǎng)友 客人 發(fā)表于: 2010/12/30 1:48:16

    支持( 0 ) 蓋樓(回復(fù))

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)