首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC 1.0 深度剖析 (1):MvcHandler 處理管線進入點全解析

     編輯:關於ASP.NET

`MvcHandler` 是 MVC 管線的真正起點,實作 `IHttpHandler`,在 `ProcessRequest` 中完成控制器建立與執行。本文逐行解析原始碼,揭示路由對應、ControllerFactory 建立、Controller 執行全流程。

ProcessRequest 核心流程

protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
    AddVersionHeader(httpContext);

    string controllerName = RequestContext.RouteData.GetRequiredString("controller");

    IControllerFactory factory = ControllerBuilder.GetControllerFactory();
    IController controller = factory.CreateController(RequestContext, controllerName);
    if (controller == null)
        throw new InvalidOperationException(...);

    try
    {
        controller.Execute(RequestContext);
    }
    finally
    {
        factory.ReleaseController(controller);
    }
}

三大關鍵步驟深度解析

1. 加入版本標頭

private void AddVersionHeader(HttpContextBase httpContext)
{
    httpContext.Response.AppendHeader("X-AspNetMvc-Version", "1.0");
}

回應標頭標示 MVC 版本,便於診斷與相容性檢測。

2. 從路由取得控制器名稱

string controllerName = RequestContext.RouteData.GetRequiredString("controller");

路由表 (`RouteCollection`) 在 `UrlRoutingModule.PostResolveRequestCache` 階段已解析並填入 `RouteData.Values["controller"]`。

3. ControllerFactory 建立與釋放控制器

  • ControllerBuilder:單例靜態類別,持有 `IControllerFactory` 實例。
  • 預設工廠:`DefaultControllerFactory`,在 `ControllerBuilder` 建構子自動註冊。
    public ControllerBuilder()
    {
        SetControllerFactory(new DefaultControllerFactory { ControllerBuilder = this });
    }
    
  • CreateController:依命名空間慣例尋找控制器類型 (`{Namespace}.Controllers.{Name}Controller`),透過 `Activator.CreateInstance` 實例化。
  • ReleaseController:若控制器實作 `IDisposable` 則呼叫 `Dispose()`,支援資源釋放。

擴充點與自訂

擴充點用途實作方式
IControllerFactory完全掌控控制器建立/釋放實作介面,`ControllerBuilder.Current.SetControllerFactory()`
DefaultControllerFactory調整控制器類型搜尋邏輯繼承覆寫 `GetControllerType`、`GetControllerInstance`
ControllerBuilder設定預設命名空間、快取控制器類型`ControllerBuilder.Current.DefaultNamespaces.Add()`

生命週期總結

HttpRequest
    ↓
UrlRoutingModule → RouteData
    ↓
MvcHandler.ProcessRequest
    ↓
ControllerBuilder → IControllerFactory
    ↓
CreateController(controllerName)
    ↓
Controller.Execute(RequestContext)
    ↓
ExecuteCore → TempData.Load → ActionInvoker.InvokeAction → TempData.Save
    ↓
ReleaseController
    ↓
HttpResponse

掌握 `MvcHandler` 入口機制,能深入理解 MVC 請求處理全貌,並能在極早期攔截請求 (如自訂 `IHttpModule` 配合 `PreRequestHandlerExecute`),實現多租戶路由、動態控制器載入等進階架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved