ISAPI (Internet Server API) 是 Microsoft IIS 提供的高效能伺服器擴充介面。相較 CGI 為每請求建立進程,ISAPI 以 DLL 形式載入 IIS 進程空間,首次載入後常駐記憶體,後續請求僅建立執行緒處理,大幅降低延遲與資源消耗。本文介紹 ISAPI 擴展核心概念與 C++ Builder 開發要點。
.dll 對應),類比 CGI 腳本角色。本文重點。LoadLibrary 載入HttpExtensionProcEXTENSION_CONTROL_BLOCK (ECB) 結構傳遞請求資料:WriteClient, ReadClient, ServerSupportFunction)HSE_STATUS_SUCCESS / HSE_STATUS_ERRORDWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB) {
// 1. 解析請求
char *query = pECB->lpszQueryString;
char *method = pECB->lpszMethod; // "GET" / "POST"
// 2. 發送 HTTP 標頭
char header[] = "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n";
pECB->WriteClient(pECB->ConnID, header, &headerLen, 0);
// 3. 產生內容
char content[] = "Hello from ISAPI!
";
pECB->WriteClient(pECB->ConnID, content, &contentLen, 0);
return HSE_STATUS_SUCCESS;
}
HttpExtensionProc、GetExtensionVersion、TerminateExtension#include <httpext.h> (Windows SDK)GetExtensionVersion:回傳版本資訊、擴展名稱HttpExtensionProc:核心請求處理TerminateExtension:卸載前清理 (關閉資料庫連線、釋放快取)MyIsapi.dllC:\Inetpub\Scripts).dll → 可執行檔 MyIsapi.dll、動詞 GET,POST、腳本引擎勾選| 挑戰 | 對策 |
|---|---|
| 執行緒安全 | IIS 多執行緒並發呼叫 HttpExtensionProc,全域/靜態變數必須用 Critical Section / SRW Lock / Interlocked API 保護 |
| 記憶體洩漏 | DLL 常駐,任何 new/malloc 未釋放會累積耗盡記憶體。嚴格 RAII、智慧指標、定期巡檢 |
| 阻塞操作 | 資料庫查詢、外部 API 呼叫會阻塞 IIS 執行緒池。改用非同步 I/O、佇列+背景執行緒、或遷移至 ASP.NET Core / Node.js 等現代架構 |
| 除錯困難 | Attach to w3wp.exe 進程除錯、大量日誌、單元測試核心邏輯與 ISAPI 薄層分離 |
| 相容性 | IIS 版本差異 (5.0/6.0/7.0+ 整合管線模式)。測試目標版本,注意 HSE_VERSION 協商 |
ISAPI 屬於 IIS 4.0/5.0 時代技術 (約 1997-2003)。新專案強烈建議:
web.config aspNetCore / httpPlatform 模組轉發至 Kestrel/HTTP.sys僅在維護舊系統、特殊效能需求 (零開銷原生呼叫)、或嵌入式 Windows 環境時考慮 ISAPI。