ASP.NET MVC 過濾器(三)

來源:互聯網
上載者:User

標籤:des   style   class   blog   code   http   

 ASP.NET MVC 過濾器(三)前言

本篇講解行為過濾器的執行過程,過濾器實現、使用方式有AOP的意思,可以通過學習瞭解過濾器在架構中的執行過程從而獲得一些AOP方面的知識(在順序執行的過程中,這種編程模式就是橫向的插入點),言歸正傳,我們還是以學習過濾器為主。對於IAuthorizationFilter授權認證過濾器的使用篇幅,我知道怎麼用但是寫不出來,裡麵包含知識點很多,功底尚淺寫了一半又給刪掉了,寧願不發也不能坑人,在後面的學習中假使我可以掌握了,一定會及時的寫出來跟大家分享。這個目錄也空在這也算是給自己的一個提醒吧。

 

ASP.NET MVC 過濾器
  • 過濾器在系統架構中的整體物件模型
  • IAuthorizationFilter授權認證過濾器的執行過程
  • 使用IAuthorizationFilter過濾器
  • IActionFilter行為過濾器的執行過程
  • 自訂實現IActionFilter行為過濾器
  • 異常過濾器的使用

 

IActionFilter行為過濾器的執行過程

我們直接進入主題,這裡的執行過程還是接著過濾器(一)中的部分,我們看下執行過程的:

圖1

1所示,就是整個的一個執行過程,圖太大拆開來看,這樣比較細緻一點(這裡捎帶一句,後面許多部分的內容都都包含在這個裡,比如說Model中繼資料、Model綁定和Model驗證)。

圖2

首先是調用了ControllerActionInvoker類型的GetParameterValues()方法,GetParameterValues()方法的參數是控制器上下文參數對象【ControllerContext類型】和控制器方法描述對象【ActionDescriptor類型】,然後在此方法中會根據ActionDescriptor類型的參數來調用GetParameters()方法擷取到控制器方法參數的描述對象【ParameterDescriptor類型】的集合,這裡對ParameterDescriptor類型不做過多的講解,只需瞭解它是包含了控制器方法參數的一些資訊,比如說參數名稱、參數類型等等。

圖3

從圖2中所示的那樣,擷取到了ParameterDescriptor類型的集合後,便會遍曆此集合并且調用圖3中所示的ControllerActionInvoker類型的GetParameterValue()方法【這裡注意一下跟上面的圖2所示的方法是不同的】,調用GetParameterValue()方法的目的是產生一個索引值隊類型的對象【紅色箭頭所指】,索引值隊中的鍵表示參數名稱,值則為參數的值,而產生的過程是:首先MVC架構會調用使用者自訂的模型繫結器(如果有自訂的)【實現了IModelBinder介面的類型】,並且調用自訂模型繫結器的方法以此來擷取控制器方法參數的參數值,如果沒有發現自訂的模型繫結器,則會調用預設的Model綁定器進行參數綁定,如果沒有匹配的類型返回一個預設值ParameterDescriptor.DefaultValue】。(關於Model綁定器內容後續系列會有講解)

圖4

有了參數值資訊的索引值隊過後,接著調用ControllerActionInvoker類型的InvokeActionMethodWithFilters()方法,在此方法會產生兩種參數類型以便由ControllerActionInvoker類型的InvokeActionMethodFilter()方法調用,下面我們先講解這兩種參數類型:

  1. ActionExecutingContext
  2. Func<ActionExecutedContext>

第一個參數

1 public class ActionExecutingContext : ControllerContext2     {3         public ActionExecutingContext();4         public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> actionParameters);5 6         public virtual ActionDescriptor ActionDescriptor { get; set; }7         public virtual IDictionary<string, object> ActionParameters { get; set; }8         public ActionResult Result { get; set; }9     }

在上面類型的定義中,我們瞭解到ActionExecutingContext類型繼承至ControllerContext類型,並且包含著一些資訊的引用,這便是可以在控制器方法執行之前執行自己的一些自訂動作。

第二個參數

 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類型的區別在於前者多了兩個屬性一個是用於儲存異常資訊的,另一個屬性是用來設定是否處理了異常,這個會在異常過濾器篇幅中講解。

切回主題,大概知道這兩種類型的定義就行了,說到Func<ActionExecutedContext>類型的參數,在MVC架構中預設的設定了Lambda運算式,並且對傳回型別中的Result屬性又設定了一個運算式調用的是ControllerActionInvoker類型的InvokeActionMethod()方法,這個方法後面會講到。我們看一下運算式的定義,不然有點混亂:

1 Func<ActionExecutedContext> seed = () =>2                 {3                     new ActionExecutedContext(controllerContext,actionDescriptor, false,null) 4                         {5                             Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters) 6                         }7                 };

上述的這些參數都準備完畢後,可以調用執行最後的ControllerActionInvoker類型的InvokeActionMethodFilter()方法,而其中的IActionFilter類型的參數則有在前面篇幅中講到的FilterInfo類型中的ActionFilters屬性提供,並且是遍曆執行的,最後可以看到在InvokeActionMethodFilter()方法的內部首先是由IActionFilter類型的參數調用了OnActionExecuting()方法,然後執行Func<ActionExecutedContext>類型的參數,因為上面說到的,這個委託類型的參數已經定義好了預設的執行方式,是執行ControllerActionInvoker類型的中的InvokeActionMethod()方法,在此方法執行後在執行IActionFilter類型的OnActionExecuted()方法,並且最終的結果值返回到了ActionExecutedContext類型的Result屬性中。

最後我們看一下IActionFilter類型的結構定義:

 1     public interface IActionFilter 2     { 3         // 摘要: 4         //     在執行操作方法後調用。 5         // 6         // 參數: 7         //   filterContext: 8         //     篩選器上下文。 9         void OnActionExecuted(ActionExecutedContext filterContext);10         //11         // 摘要:12         //     在執行操作方法之前調用。13         //14         // 參數:15         //   filterContext:16         //     篩選器上下文。17         void OnActionExecuting(ActionExecutingContext filterContext);18     }

行為過濾器大概的執行過程講解完畢了,下一篇會對這種類型的過濾器的應用作大概講解。

 

 

 

金源

出處:http://www.cnblogs.com/jin-yuan/

本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.