[技術探討]客製化MVC網站的Action Filter

Action filter

身為大量簡訊發送平台的開發廠商,我們不僅只提供簡訊發送服務,也提供可建置在客戶環境裡的完整解決方案,而這也代表著我們必須配合客戶需求進行簡訊系統的客製化,最常見的客製化就是配合客戶環境的單一登入機制(Single Sign On)進行身分驗證或是授權的修改。

詮力的最新的簡訊發送平台採用ASP.NET MVC開發,而這次遇到的難題是客戶要求即使使用者已通過身分驗證(登入成功),每一次的Web Request都要再與身分識別服務的主機進行驗證。

查詢了一下現有MVC的解決方案,不外乎1.使用Base Controller與身分識別服務的主機進行驗證,再讓所有的Controller套用此Base Controller。或是2.客製化Action Filter,再讓所有的Controller套用此Filter。本篇文章採用方法二,來討論一下MVC網站如何客製化Action Filter。(註:純Web API的網站若要客製化Action Filter,細節會與本篇略有不同喔)

首先簡介一下ASP.NET MVC 各類型的Filter(篩選條件):

1.Authentication Filter驗證篩選條件(MVC 5新增加的類型) ,用於執行驗證而做出是否執行動作方法的安全性決策。

  1. Authorization Filter授權篩選條件,用於執行授權而做出是否執行動作方法的安全性決策。
  2. Action Filter動作篩選條件,其中包裝了動作方法的執行。 此篩選條件可以執行額外的處理,例如提供額外的資料給動作方法、檢查傳回值,或取消執行動作方法。
  3. Result Filter結果篩選條件,其中包裝了 ActionResult 物件的執行。 此篩選條件可以執行額外的結果處理,例如修改 HTTP 回應。
  4. Exception Filter例外狀況篩選條件,動作方法中的某處擲回未處理的例外狀況時便會執行,以授權篩選條件開始,並且以執行結果做為結束。 例外狀況篩選條件可以用於記錄或顯示錯誤頁面這類工作。

接下來會使用Action filter(動作篩選條件),來說明MVC網站如何套用filter。

1.在MVC網站裡建立Filters資料夾,並在資料夾裡加入類別,例如MyFilter。(註:很重要的一點是此類別不能放在App_Code資料夾裡,否則在Controller裡會找不到此客製化的Filter)

Action filter

  1. MyFilter類別繼承ActionFilterAttribute, IActionFilter,並覆寫OnActionExecuting方法。(還有OnActionExecuted等事件,依需求選擇要覆寫的事件)

Action filter

  1. 在Controller或Action套用MyFilter屬性。

Action filter

4.若不想一個一個Controller或Action套用MyFilter Attribute,另一個做法是在App_Start資料夾下的FilterConfig.cs裡加入filters.Add(new MyFilter());

Action filter

驗證方法:可在MyFilter.cs裡覆寫的方法裡加入Log紀錄RouteData。

Action filter

6.最後驗證結果如下圖。

Action filter

結論:Filter幫助MVC網站做Log、驗證授權、例外處理等動作時,有個屬性可輕鬆套用在整個網站、個別Controller、或個別Action上,所以學會Filter的開發是很重要的。搜尋資料的過程中,還發現有人拿Action Filter作客製化的效能指標,可在效能監視器裡使用,也是很有趣的應用喔,見參考資料4。

參考資料:

  1. NET MVC 4 Custom Action Filters ─ http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-custom-action-filters
  2. NET MVC 應用程式中的動作篩選 ─ https://msdn.microsoft.com/zh-tw/library/dd410209.aspx
  3. Understanding Action Filters ─ http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs
  4. Building Performance Metrics into ASP.NET MVC Applications ─ https://www.simple-talk.com/dotnet/performance/building-performance-metrics-into-asp.net-mvc-applications/

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料