ASP.NET MVC是如何啟動並執行(3): Controller的啟用

來源:互聯網
上載者:User

ASP.NET MVC的URL路由系統通過註冊的路由表對HTTP請求進行解析從而得到一個用於封裝路由資料的RouteData對象,而這個過程是通過自訂的UrlRoutingModule對HttpApplication的PostResolveRequestCache事件進行註冊實現的。RouteData中已經包含了目標Controller的名稱,現在我們來進一步分析真正的Controller對象是如何被啟用的。我們首先需要瞭解一個類型為MvcRouteHandler的類型。

一、MvcRouteHandler

通過前面的介紹我們知道繼承自RouteBase的Route類型具有一個類型為IRouteHandler介面的屬性RouteHandler,它主要的用途就是用於根據指定的請求上下文(通過一個RequestContext對象表示)來擷取一個HttpHandler對象。當GetRouteData方法被執行後,Route的RouteHandler屬性值將反映在得到的RouteData的同名屬性上。在預設的情況下,Route的RouteHandler屬性是一個MvcRouteHandler對象,如下的代碼片斷反映了這一點。

   1: public class Route : RouteBase
2: {
3: //其他成員
4: public IRouteHandler RouteHandler { get; set; }
5: public Route()
6: {
7: //其他動作
8: this.RouteHandler = new MvcRouteHandler();
9: }
10: }

對於我們這個“迷你版”的ASP.NET MVC架構來說,MvcRouteHandler是一個具有如下定義的類型。在實現的GetHttpHandler方法中,它直接返回一個MvcHandler對象。

   1: public class MvcRouteHandler: IRouteHandler
2: {
3: public IHttpHandler GetHttpHandler(RequestContext requestContext)
4: {
5: return new MvcHandler(requestContext);
6: }
7: }

二、MvcHandler

在前面的內容中我們已經提到整個ASP.NET MVC架構是通過自訂的HttpModule和HttpHandler對象ASP.NET進行擴充實現的。這個自訂HttpModule我們已經介紹過了,就是UrlRoutingModule,而這個自訂的HttpHandler則是我們要重點介紹的MvcHandler。

UrlRoutingModule在通過路由表解析HTTP請求得到一個用於封裝路由資料的RouteData後,或調用其RouteHandler的GetHttpHandler方法得到HttpHandler對象並註冊到當前的HTTP上下文。由於RouteData的RouteHandler來源於對應Route對象的RouteHandler,而後者在預設的情況下是一個MvcRouteHandler對象,所以預設情況下用於處理HTTP請求的就是這麼一個MvcHandler對象。MvcHandler實現了對Controller對象的啟用和對相應Action方法的執行。

下面的的代碼片斷體現了MvcHandler的整個定義,它具有一個類型為RequestContext的屬性工作表示被處理的當前請求上下文,該屬性在建構函式指定。在實現的ProcessRequest中實現了對Controller對象的啟用和執行。

   1: public class MvcHandler: IHttpHandler
2: {
3: public bool IsReusable
4: {
5: get{return false;}
6: }
7: public RequestContext RequestContext { get; private set; }
8: public MvcHandler(RequestContext requestContext)
9: {
10: this.RequestContext = requestContext;
11: }
12: public void ProcessRequest(HttpContext context)
13: {
14: string controllerName = this.RequestContext.RouteData.Controller;
15: IControllerFactory controllerFactory = ControllerBuilder.Current.GetControllerFactory();
16: IController controller = controllerFactory.CreateController(this.RequestContext, controllerName);
17: controller.Execute(this.RequestContext);
18: }
19: }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.