熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET MVC 4框架揭秘:Controller的激活(1)

2022-06-13   來源: .NET編程 

    Controller的激活(

  ASPNET MVC的URL路由系統通過注冊的路由表對HTTP請求進行解析從而得到一個用於封裝路由數據的RouteData對象而這個過程是通過自定義的UrlRoutingModule對HttpApplication的PostResolveRequestCache事件進行注冊實現的RouteData中已經包含了目標Controller的名稱我們需要根據該名稱激活對應的Controller對象接下來進一步分析真正的Controller對象是如何被激活的

  MvcRouteHandler

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

  public class Route : RouteBase

  {

  //其他成員

  public IRouteHandler RouteHandler { get; set; }

  public Route()

  {

  //其他操作

  thisRouteHandler = new MvcRouteHandler()

  }

  }

  對於我們這個迷你版的ASPNET MVC框架來說MvcRouteHandler是一個具有如下定義的類型在實現的GetHttpHandler方法中它會直接返回一個MvcHandler對象

  public class MvcRouteHandler: IRouteHandler

  {

  public IHttpHandler GetHttpHandler(RequestContext requestContext)

  {

  return new MvcHandler(requestContext)

  }

  }

  MvcHandler

  在前面的內容中已經提到整個ASPNET MVC框架是通過自定義的HttpModule和HttpHandler對象ASPNET進行擴展實現的這個自定義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對象的激活和執行

  public class MvcHandler: IHttpHandler

  {

  public bool IsReusable

  {

  get{return false;}

  }

  public RequestContext RequestContext { get; private set; }

  public MvcHandler(RequestContext requestContext)

  {

  thisRequestContext = requestContext;

  }

  public void ProcessRequest(HttpContext context)

  {

  string controllerName = thisRequestContextRouteDataController;

  IControllerFactory controllerFactory =

  ControllerBuilderCurrentGetControllerFactory()

  IController controller = controllerFactoryCreateController(

  thisRequestContext controllerName)

  controllerExecute(thisRequestContext)

  }

  }

       返回目錄ASPNET MVC 框架揭秘

       編輯推薦

       ASP NET開發培訓視頻教程

       Microsoft NET框架程序設計視頻教程

       Java程序性能優化讓你的Java程序更快更穩定

       Visual C++音頻/視頻技術開發與實戰


From:http://tw.wingwit.com/Article/program/net/201311/16109.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.