ASP.NET MVC中使用攔截器

本文 ASP.NET MVC中使用攔截器摘要: ASP.NET MVC框架內置了攔截Action的機制。確切的分爲:Action攔截器Result攔截器Exception攔截器三種。所謂 ASP.NET MVC攔截器,就是一個普通的類,該類需要繼承FilterAttribute基類,Action攔截器還要實現IActionFilter接口,而Exception攔截器需要實現IExceptionFilter接口。

        Action執行過濾的接口爲:IActionFilter它有兩個方法,OnActionExecuted:作用是Action執行後過濾;OnActionExecutingAction執行前過濾。而FilterAttribute表示用在屬性上的成員篩選器。

 
    一、日誌攔截器
這個類繼承了FilterAttribute並實現了接口的IActionFilter的兩個方法:OnActionExecuting在被攔截Action前執行了準備寫入日誌操作,OnActionExecuted在被攔截Action後執行操作完成日誌。兩個方法都有一個參數,雖然類型不同,但其實都是一個作用:被攔截Action的上下文。
 
    二、異常攔截器
 
異常攔截器一樣需要繼承FilterAttribute,但是不要實現IActionFilter,而是要實現IExceptionFilter接口,這個接口只有一個方法:OnException,顧名思義,當然是發生異常時被調用了。我們看看我讓它做了什麼:首先將異常信息(ExceptionContext一樣也是上下文,而其成員的Exception就是一個Exception類型的實例,就是被拋出的異常)記錄到ViewData相應的鍵值裏,然後我們要呈現Error這個視圖。
注意!這裏已經不是Controller裏了,而是另一個類,所以當然不能調用View方法返回ViewResult實例了。我們只好新建一個ViewResult實例,並將其視圖名設爲Error,將上下文中的DataView傳過去。
最後那行filterContext.ExcepitonHandled = true;很重要,這行的意思是告訴系統,異常已經處理,不要再次處理了。
使用攔截器固然很爽,但是要注意兩個地方:
1.Action攔截器的作用範圍
除了用Action攔截器標記一個Action方法外,你也可以用來標記一個完成的控制器類。如果這樣的話,這個Action攔截器將會應用到該控制器的所有Action方法上。
另外,如果你的控制器類繼承自別的控制器類,而基控制器類可能有它自己的Action攔截器Attributes。如果你在子類中重寫了基控制器類的Action方法,則子類的該Action方法也會有它自己的從基類繼承而來的Action攔截器Attributes。
2.Action攔截器的執行順序
每一個Action攔截器都有一個 Order 屬性,用來決定Action攔截器在該範圍內的執行順序。Order屬性必需是0(默認值)或者更大的整數值。省略Order屬性則會給該攔截器的Order值爲 -1, 表明爲指明順序。任何一個在同一範圍的Action攔截器Order設爲 -1 的都將按不確定的順序執行,單在此之前攔截器有一個特定的順序(注:下面會說到).
當設置Order屬性的值的時候,必需指定一個唯一的值。如果兩個或者更多的Action攔截器具有相同的Order屬性值,將會拋出一個異常。
來看一個示例:
[Filter1(Order 2)]
[Filter2(Order
 3
)]
[Filter3(Order
 1)]
public void 
Index()
{
    RenderView(
"Index"
);
}
Filter的執行順序爲:Filter3 => Filter1 => Filter2.
 
綜上所述,使用攔截器顯而易見的優點:
1. 解決了部分代碼重複的問題。很多日誌處理代碼和異常處理代碼是很相似的,這樣就導致了各個Action中存在大量重複代碼。
2. 職責的明確化。 Controller僅僅是控制器,只負責表示邏輯,而不應該被一大堆日誌處理代碼和try...catch塊包圍。我們要的Action,應該是乾淨的、工整的、僅包含表示邏輯的Action。
3. 代碼更加優雅。
 
 當然了,也有他的缺點,在 ASP.NET MVCController中一個Action最好不要超過2,3個帽子(攔截器或過濾器),否則性能會受到影響。
 
關於更多的業務組件的內容,大家可以訪問http://www.po-soft.com/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章