程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC是如何運行的(3): Controller的激活

ASP.NET MVC是如何運行的(3): Controller的激活

編輯:關於ASP.NET

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: }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved