ASP.NET MVC 是微軟基於 MVC 設計模式構建的 Web 應用框架,它將應用程式拆分為三大核心組件,實現關注點分離,並提供對 HTML、CSS、JavaScript 的完全控制。本文從架構分層、請求生命週期、核心上下文體系三個維度,深度剖析其內部運作機制。
| 層級 | 組件 | 核心職責 | 對應邏輯層 |
|---|---|---|---|
| 模型 | Model | 業務邏輯、數據訪問、實體類、驗證規則 | Business Layer |
| 視圖 | View | 頁面渲染、模板引擎、UI 呈現 | Display Layer |
| 控制器 | Controller | 請求路由、參數綁定、協調 Model/View、返回 ActionResult | Input Control |
這種分層使得單元測試容易、前後端並行開發、邏輯複用性高。
ASP.NET MVC 建立在 ASP.NET 運行時之上,核心上下文繼承關係如下:
HttpContext (ASP.NET 核心)
↓ 封裝
ControllerContext (MVC 核心)
↓ 繼承
ActionExecutingContext / ActionExecutedContext / ResultExecutingContext / ResultExecutedContext / ExceptionContext (過濾器上下文)
↓ 繼承
ViewContext (視圖渲染上下文)
當 IIS 接收請求,經過 ISAPIRuntime.ProcessRequest → HttpRuntime.ProcessRequestInternal 實例化 HttpContext,其構造函數內部同時初始化 HttpRequest 與 HttpResponse。HttpContext 貫穿整個請求/響應生命週期,承載:
Request.Url、Request.Form、Request.Headers、Request.CookiesResponse.Write、Response.StatusCode、Response.Cookies、Response.CacheSession、User (IPrincipal)、Application、CacheServer.GetLastError()在 ControllerBase.Initialize(RequestContext) 中實例化:
protected virtual void Initialize(RequestContext requestContext) {
ControllerContext = new ControllerContext(requestContext, this);
}
它封裝了 HttpContextBase(HttpContext 的抽象基類,便於單元測試 Mock)、RouteData(路由數據)、Controller 實例本身,是所有 MVC 核心組件的上下文基類。
過濾器實現 IActionFilter、IResultFilter、IExceptionFilter、IAuthorizationFilter 等接口,對應不同階段的上下文:
ActionExecutingContext:Action 執行前,可修改參數、取消執行 (Result 屬性)ActionExecutedContext:Action 執行後,可獲取返回值、異常信息ResultExecutingContext / ResultExecutedContext:ViewResult 執行前後ExceptionContext:未捕獲異常時,可標記 ExceptionHandled = true 吞噬異常這些上下文在 ControllerActionInvoker.InvokeActionMethodWithFilters 中被實例化並傳遞,構成了 MVC 強大的切面編程能力。
在 ViewResultBase.ExecuteResult、HtmlHelper、TemplateHelpers 中創建,封裝:
ViewData / TempData:視圖數據字典ViewBag:動態屬性包裝器Writer:輸出流 (TextWriter)View:IView 實例ClientValidationEnabled、UnobtrusiveJavaScriptEnabled:客戶端驗證開關UrlRoutingModule 解析 URL → RouteDataControllerFactory 實例化 Controller → Initialize 注入 ControllerContextActionInvoker 遍歷過濾器 → Authorization → ActionExecuting → Action → ActionExecuted → ResultExecuting → Result 執行 → ResultExecutedViewEngine 定位視圖 → View.Render(ViewContext) → 輸出 HTMLDispose、OnResultExecuted 最後清理IService,配合 IDependencyResolver 管理生命週期。理解上下文體系的繼承鏈與生命週期節點,是排查疑難雜症、編寫高質量擴展點(如自定義 ModelBinder、ActionFilter、ViewEngine)的關鍵。ASP.NET MVC 雖已進入維護模式(Core 為主流),但其設計思想在 ASP.NET Core 中得以延續與升華。