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

ASP.NET 底層架構:從瀏覽器請求到 ASP.NET 管線的完整旅程

     編輯:關於ASP.NET

請求啟動

使用者在瀏覽器輸入 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

  1. `HttpRuntime` 處理應用程式啟動、編譯、請求佇列、執行緒排程。
  2. 每個請求獲取/建立 `HttpApplication` 實例 (從應用程式池取得)。
  3. `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/自訂) → 執行業務邏輯 → 回應。理解此流程是效能調校、安全強化、架構遷移的基石。

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