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

ASP.NET 架構與安全機制深度解析系列:HTTP 請求處理管線全景圖

     編輯:關於ASP.NET

系列緒言

本文為系列首篇,旨在自底向上建立 ASP.NET 請求處理管線完整認知:從 IIS 接收請求、ISAPI 擴展、ASP.NET ISAPI (aspnet_isapi.dll)、HttpRuntime、HttpApplicationFactory、HttpApplication、HttpModule、HttpHandler、Page/Handler 執行,到回應輸出。理解管線每個階段的職責、攔截點、擴展性,是掌握安全機制(驗證/授權/Provider 模型)的基石。

IIS 與 ISAPI 架構基礎

靜態 vs 動態資源處理

  • 靜態資源(.html、.css、.js、.jpg):IIS 直接從檔案系統讀取,以位元組流透過 HTTP 回應,不經 ASP.NET 管線。
  • 動態資源(.aspx、.asmx、.ashx、.axd、.asax、.ascx):IIS 依據副檔名對應表,將請求轉交給對應的 ISAPI 擴展處理。

ISAPI 擴展對應表 (IIS 5/6 經典模式)

副檔名ISAPI 擴展說明
.aspasp.dll傳統 ASP 解釋器
.aspxaspnet_isapi.dllASP.NET 請求進入點
.asmxaspnet_isapi.dllXML Web Service
.ashxaspnet_isapi.dllHTTP Handler
.axdaspnet_isapi.dll內部 HTTP Handler (Trace.axd, WebResource.axd...)
.asaxaspnet_isapi.dllGlobal.asax 應用程式類別
.ascxaspnet_isapi.dllUser Control

aspnet_isapi.dll 關鍵職責

  1. 將原生 ISAPI `EXTENSION_CONTROL_BLOCK` 封裝為 Managed `HttpWorkerRequest`。
  2. 呼叫 `HttpRuntime.ProcessRequest` 進入 Managed 管線。
  3. 管理應用程式域(AppDomain)載入/卸載、啟動 `HttpRuntime` 單例。
  4. 處理野字元對應、檔案變更監視、編譯錯誤回報。

ASP.NET Managed 管線核心類別


HttpRuntime (單例)
    │
    ├── HttpApplicationFactory: 管理 HttpApplication 池
    │       │
    │       └── HttpApplication (每請求一個實例,池化複用)
    │               │
    │               ├── HttpContext: 封裝 Request/Response/Session/Cache/User/Items
    │               ├── HttpRequest: 輸入資料 (QueryString, Form, Files, Headers, Cookies, Url)
    │               ├── HttpResponse: 輸出控制 (Write, Redirect, Headers, Cookies, Filter, Cache)
    │               ├── HttpModule 集合: 管線事件攔截 (Auth, Session, Cache, Error, OutputCache...)
    │               └── HttpHandler: 終端處理器 (Page, WebService, Generic Handler, MVC Controller)

請求處理 22 個管線事件 (HttpApplication Events)

順序事件階段典型用途
1BeginRequest請求開始URL Rewrite、記錄存取日誌、啟動計時器
2AuthenticateRequest驗證FormsAuthenticationModule 驗證 Ticket、WindowsAuthenticationModule 驗證 NTLM/Kerberos
3PostAuthenticateRequest驗證後自訂 Principal 替換
4AuthorizeRequest授權UrlAuthorizationModule 檢查 規則
5PostAuthorizeRequest授權後權限快取、動態授權邏輯
6ResolveRequestCache快取OutputCacheModule 檢查輸出快取、略過後續管線
7PostResolveRequestCache快取後快取未命中時的預處理
8MapRequestHandler處理器對應依路由/副檔名選擇 HttpHandler (Page, .ashx, MVC Controller)
9PostMapRequestHandler對應後Handler 相關初始化
10AcquireRequestState狀態獲取SessionStateModule 載入 Session、ProfileModule 載入 Profile
11PostAcquireRequestState狀態後Session 可用後的邏輯
12PreRequestHandlerExecuteHandler 前最後準備、效能計數器
13ExecuteRequestHandlerHandler 執行Page.ProcessRequest、Controller.Execute、Handler.ProcessRequest
14PostRequestHandlerExecuteHandler 後清理 Handler 資源、記錄執行時間
15ReleaseRequestState狀態釋放SessionStateModule 儲存 Session、更新鎖定
16PostReleaseRequestState釋放後狀態持久化完成
17UpdateRequestCache快取更新OutputCacheModule 儲存回應至快取
18PostUpdateRequestCache快取後快取儲存完成
19LogRequest記錄自訂審計日誌、健康監控
20PostLogRequest記錄後
21EndRequest請求結束壓縮回應 (Gzip/Deflate)、關閉連線、最終清理
22PreSendRequestHeaders / PreSendRequestContent發送前最後修改 Headers/Content、移除 Server Header

整合模式 管線差異

  • IIS 7+ 整合模式:Managed 管線與 IIS 原生管線融合,所有模組(Managed/Native)共用同一事件序列。
  • system.webServer/modules 取代 system.web/httpModules,runAllManagedModulesForAllRequests 控制靜態檔案是否經 Managed 模組。
  • 模組註冊:`[assembly: PreApplicationStartMethod]`、`WebActivator`、或 `IHttpModule` 介面配合 `DynamicModuleUtility.RegisterModule`。

Global.asax 應用程式層級事件

public class Global : HttpApplication {
    void Application_Start() { /* 初始化 DI 容器、快取、排程、靜態資料 */ }
    void Application_End() { /* 釋放資源、關閉連線、停止排程 */ }
    void Application_Error() { /* 全域例外記錄、友善錯誤頁、通知 */ }
    void Session_Start() { /* 初始化 Session 資料、線上人數計數 */ }
    void Session_End() { /* 清理 Session 資源、離線處理 */ }
    // 以上 22 個管線事件皆可在這裡以 Application_EventName 形式覆寫
}

下一篇預告

下一篇將深入剖析 Forms Authentication 機制:Ticket 加密/解密、Cookie 管理、滑動過期、機器金鑰、跨應用程式單一登入 (SSO)、自訂 `MembershipProvider`/`RoleProvider` 實作與 Provider 模型設計精髓。

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