請求啟動
使用者在瀏覽器輸入 URL、點擊連結、提交表單 (POST) 或呼叫 Web Service。HTTP 請求抵達 Web 伺服器 (IIS)。
IIS 與 ASP.NET 交互:ISAPI 擴充
- IIS 透過 **腳本對應** 將副檔名 (`.aspx`、`.asmx`、`.ashx` 等) 對應至 `aspnet_isapi.dll` (ASP.NET ISAPI 擴充)。
- 此對應可在 IIS 管理員 → 網站屬性 → 主目錄 → 設定 → 對應 中查看/修改。
- 工具註冊:`aspnet_regiis -i` (註冊特定 .NET 版本的 ISAPI、腳本對應、客戶端腳本)。
ASP.NET ISAPI 角色
- 極薄的非託管 DLL,僅負責**路由**:將原始 HTTP 請求轉發至 ASP.NET 執行階段 (CLR)。
- 不處理業務邏輯、不管理執行緒、不編譯頁面。
- IIS 5/6:跨進程 Named Pipe 傳遞至 `aspnet_wp.exe` / `w3wp.exe`。
IIS 7+ 整合模式:直接載入於 `w3wp.exe` 進程,無跨進程開銷。
HTTP 執行階段:HttpRuntime 與 HttpApplication
- `HttpRuntime` 處理應用程式啟動、編譯、請求佇列、執行緒排程。
- 每個請求獲取/建立 `HttpApplication` 實例 (從應用程式池取得)。
- `HttpApplication` 執行 **管線事件**:
- BeginRequest → AuthenticateRequest → AuthorizeRequest → ResolveRequestCache
- AcquireRequestState (Session) → PreRequestHandlerExecute
- **ExecuteRequestHandler** (核心:頁面/Handler 執行)
- ReleaseRequestState → UpdateRequestCache → LogRequest → EndRequest
HTTP Handler:請求的終點
- 實作 `IHttpHandler`:`ProcessRequest(HttpContext)`、`IsReusable`。
- `.aspx` → `PageHandlerFactory` → 編譯產生 `Page` 類別 (繼承 `IHttpHandler`)。
- `.asmx` / `.svc` → `WebServiceHandlerFactory` / `ScriptHandlerFactory`。
- `.ashx` → 直接對應自訂 `IHttpHandler` 類別。
- 設定於 `web.config` `` (IIS 6/經典) 或 `` (IIS 7+ 整合)。
HTTP Module:管線攔截器
- 實作 `IHttpModule`:`Init(HttpApplication)` 訂閱事件、`Dispose()`。
- 類比 ISAPI Filter:可攔截/修改每個請求的任何階段。
- 內建模組:`SessionStateModule`、`FormsAuthenticationModule`、`UrlAuthorizationModule`、`OutputCacheModule` 等。
- 自訂模組:全域錯誤處理、URL Rewrite、請求記錄、防重複提交 (見文章 18684)。
Page 類別:WebForms 核心
- 繼承 `TemplateControl` → `Control` → `IHttpHandler`。
- 生命週期事件:`PreInit` → `Init` → `InitComplete` → `PreLoad` → `Load` → `Control Events` → `LoadComplete` → `PreRender` → `SaveStateComplete` → `Render` → `Unload`。
- ViewState:`LoadViewState` → `SaveViewState`,Base64 編碼存於隱藏欄位 `__VIEWSTATE`。
- PostBack:`__EVENTTARGET`、`__EVENTARGUMENT` 識別觸發控制項,`RaisePostBackEvent` 分發事件。
ASP.NET Core 時代的變革
- 無 `System.Web`、`HttpContext.Current`、`Global.asax`、`web.config`、`HttpModule/Handler`。
- Kestrel 跨平台伺服器,ANCM (ASP.NET Core Module) 整合 IIS 反向 Proxy。
- 中介軟體 管線:`app.Use(...)` 取代 `HttpModule`,`MapGet/MapPost` 取代 `HttpHandler`。
- 依賴注入 (DI) 內建、設定系統 (`appsettings.json`)、啟動類別 (`Program.cs`、`Startup.cs`)。
總結
從瀏覽器到 ASP.NET 代碼:`HTTP.sys` → `ISAPI` (舊) / 直接進入管線 (新) → `HttpRuntime` → `HttpApplication` 管線事件 → `IHttpHandler` (Page/Service/自訂) → 執行業務邏輯 → 回應。理解此流程是效能調校、安全強化、架構遷移的基石。