ASP.NET 的請求處理管線核心在於 ISAPIRuntime 物件,它是連接 IIS 與 .NET 執行階段的關鍵橋樑。每當執行階段啟動並運行時,ISAPI 程式碼會呼叫 ISAPIRuntime.ProcessRequest() 方法,這正是進入 ASP.NET 管線的真正入口點。
ISAPI 本質上是多執行緒的,因此請求會透過 AppDomainFactory.Create() 回傳的參考在多執行緒環境中被並行處理。以下是反編譯後的 ProcessRequest 核心邏輯:
public int ProcessRequest(IntPtr ecb, int iWRType)
{
HttpWorkerRequest request1 = ISAPIWorkerRequest.CreateWorkerRequest(ecb, iWRType);
string text1 = request1.GetAppPathTranslated();
string text2 = HttpRuntime.AppDomainAppPathInternal;
if (((text2 == null) || text1.Equals(".")) ||
(string.Compare(text1, text2, true, CultureInfo.InvariantCulture) == 0))
{
HttpRuntime.ProcessRequest(request1);
return 0;
}
HttpRuntime.ShutdownAppDomain("Physical application path changed from " + text2 + " to " + text1);
return 1;
}
System.Web.Hosting.ISAPIWorkerRequest 是 HttpWorkerRequest 的抽象子類別,負責將非受控的 ECB (Extension Control Block) 封裝為受控的請求上下文。它透過工廠方法 CreateWorkerRequest 根據第二個參數建立三種不同的實作:
ISAPIWorkerRequestInProc - 處理序內模式 (IIS 5)ISAPIWorkerRequestInProcForIIS6 - IIS 6 處理序內模式ISAPIWorkerRequestOutOfProc - 處理序外模式抽象的 HttpWorkerRequest 類別在低層介面上提供高層抽象,封裝了資料來源的差異。無論資料來自 CGI 伺服器、Web 瀏覽器控制項或自定義機制,ASP.NET 都能透過統一介面接收資訊。在 IIS 環境下,這層抽象建構在 ISAPI ECB 區塊之上。
ISAPIWorkerRequest 掛載 ISAPI ECB,並根據需要從中提取資訊。例如查詢字串值的提取過程展示了非受控資料如何轉換為受控物件可存取的格式。
深入理解這層架構,有助於開發者在效能調優、除錯複雜請求流程時具備系統級視野。