ISAPI (Internet Server API) 是 Microsoft IIS 提供的高效能 Web 擴充介面。相較於傳統 CGI 為每個請求建立新進程,ISAPI 以 **DLL 形式載入 IIS 處理序空間**,僅首次請求載入,後續請求以 **執行緒** 服務,極大降低資源消耗與延遲。ISAPI 分為 擴充 (Extension) 與 過濾器 兩類,本文專注於 ISAPI 擴充開發。
<img src="myGetGrp.dll">)HttpExtensionProc,傳遞 EXTENSION_CONTROL_BLOCK (ECB) 結構HttpExtensionProc 內透過 ECB 回呼函數 (WriteClient, ReadClient, ServerSupportFunction 等) 處理請求、回應資料HSE_STATUS_SUCCESS 等) 結束請求注意:IIS 以多執行緒並行處理請求,開發者**必須正確處理執行緒同步**,否則導致資料損毀或服務崩潰。
Project.cpp,包含三個必要匯出函數BOOL __export WINAPI GetExtensionVersion(HSE_VERSION_INFO &Ver)
{
Ver.dwExtensionVersion = MAKELONG(HSE_VERSION_MAJOR, HSE_VERSION_MINOR);
Ver.lpszExtensionDesc = "My ISAPI Extension";
// 可在此進行全域資源初始化
return TRUE;
}
DLL 首次載入時由 IIS 呼叫,僅執行一次。
每個 HTTP 請求觸發一次呼叫。ECB 結構關鍵欄位:
| 欄位 | 用途 |
|---|---|
lpszMethod | HTTP 方法 (GET/POST/...) |
lpszQueryString | 查詢字串 (GET 參數) |
lpszPathInfo | 路徑資訊 |
lpbData / cbAvailable / cbTotalBytes | POST 資料緩衝區 |
WriteClient | 回呼:傳送回應內容給用戶端 |
ServerSupportFunction | 回呼:傳送標頭、重導向、對應路徑等 |
DWORD __export WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *ECB)
{
char header[] = "200 OK\r\nContent-Type: text/html\r\n\r\n";
DWORD len = strlen(header);
ECB->ServerSupportFunction(ECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, header, &len, NULL);
char body[] = "Hello from ISAPI!";
len = strlen(body);
ECB->WriteClient(ECB->ConnID, body, &len, 0);
return HSE_STATUS_SUCCESS;
}
WriteClient:`BOOL (ConnID, Buffer, &Bytes, Reserved)`ReadClient:`BOOL (ConnID, Buffer, &Size)`ServerSupportFunction:`BOOL (ConnID, HSE_REQ_*, Buffer, &Size, DataType)`HSE_REQ_SEND_RESPONSE_HEADER, HSE_REQ_SEND_URL, HSE_REQ_MAP_URL_TO_PATH, HSE_REQ_DONE_WITH_SESSIONBOOL __export WINAPI TerminateExtension(DWORD dwFlags)
{
// dwFlags: HSE_TERM_ADVISORY_UNLOAD (可拒絕) 或 HSE_TERM_MUST_UNLOAD (強制)
// 執行清理工作:關閉資料庫連線、釋放記憶體等
return TRUE; // 同意卸載
}
專案選項設定輸出為 DLL,編譯產生的 `.dll` 複製至 IIS 腳本目錄 (如 `C:\Inetpub\Scripts\`),在 IIS 管理員中確保目錄具備「執行」權限,即可透過 URL 呼叫。
除手寫 ECB 處理,C++Builder 亦提供 WebSnap 高階架構:TWebModule, TISAPIApplication, TISAPIRequest, TISAPIResponse 等類別,封裝 HTTP 解析與回應生成,開發效率更高。詳細用法請參閱產品文件。
ISAPI 擴充是打造高效能 Web 應用的關鍵技術。掌握 ECB 結構與回呼機制,配合 C++Builder 強大的 C++ 編譯優化,可開發出承載高併發的企業級 Web 服務。