承上章,HttpApplicationFactory.GetApplicationInstance 取得實例並呼叫 BeginProcessRequest 進入 Pipeline。GetApplicationInstance 核心邏輯:
internal static IHttpHandler GetApplicationInstance(HttpContext context) {
if (_customApplication != null) return _customApplication;
if (context.Request.IsDebuggingRequest) return new HttpDebugHandler();
_theApplicationFactory.EnsureInited();
_theApplicationFactory.EnsureAppStartCalled(context);
return _theApplicationFactory.GetNormalApplicationInstance(context);
}
_theApplicationFactory 為單例。三行粗體代碼分別:
EnsureInited:雙重檢查鎖定呼叫 Init(),解析 global.asax 路徑並編譯(_appFilename = GetApplicationFile(); CompileApplication();)。EnsureAppStartCalled:最終呼叫 FireApplicationOnStart,建立特殊 HttpApplication 實例觸發 Application_Start 事件,執行完立即回收(僅執行一次)。GetNormalApplicationInstance:從閒置池(_freeList)取得或建立新 HttpApplication,呼叫 InitInternal 完成初始化(掛載模組、事件等),回傳實例處理請求。此流程揭示 ASP.NET 如何透過應用程式工廠管理 HttpApplication 生命週期,支援池化重用與啟動事件分離執行。