首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++ Builder 開發 ISAPI 擴展應用:高效能 Web 伺服器擴充實戰

     編輯:VC 教學

ISAPI 擴展架構與 C++ Builder 實作入門

ISAPI (Internet Server API) 是 Microsoft IIS 提供的高效能伺服器擴充介面。相較 CGI 為每請求建立進程,ISAPI 以 DLL 形式載入 IIS 進程空間,首次載入後常駐記憶體,後續請求僅建立執行緒處理,大幅降低延遲與資源消耗。本文介紹 ISAPI 擴展核心概念與 C++ Builder 開發要點。

ISAPI 兩大組件類型

  • ISAPI Extension (擴展):主動處理特定 HTTP 請求 (如 .dll 對應),類比 CGI 腳本角色。本文重點。
  • ISAPI Filter (過濾器):攔截所有 HTTP 請求/回應事件 (讀取/修改標頭、URL 重寫、認證、日誌),掛載於全域通知鏈。

ISAPI 擴展運作流程

  1. IIS 接收請求,判斷對應 ISAPI DLL (依副檔名對應或腳本對應)
  2. 檢查 DLL 是否已載入快取,否則 LoadLibrary 載入
  3. 呼叫 DLL 匯出函數 HttpExtensionProc
  4. IIS 填充 EXTENSION_CONTROL_BLOCK (ECB) 結構傳遞請求資料:
    - 客戶端資訊 (IP、標頭、憑證)
    - 請求實體 (POST 資料、查詢字串)
    - 回呼函數指標 (WriteClient, ReadClient, ServerSupportFunction)
  5. DLL 實作邏輯,透過回呼函數寫入回應
  6. 回傳 HSE_STATUS_SUCCESS / HSE_STATUS_ERROR

核心進入點:HttpExtensionProc

DWORD 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; }

C++ Builder 開發步驟

  1. 建立 DLL 專案:File → New → Other → DLL Wizard
  2. 定義模組定義檔 (.def) 匯出 HttpExtensionProc、GetExtensionVersion、TerminateExtension
  3. 包含標頭:#include <httpext.h> (Windows SDK)
  4. 實作三大匯出函數:
    • GetExtensionVersion:回傳版本資訊、擴展名稱
    • HttpExtensionProc:核心請求處理
    • TerminateExtension:卸載前清理 (關閉資料庫連線、釋放快取)
  5. 編譯為 DLL:輸出 MyIsapi.dll
  6. IIS 部署:
    • 複製 DLL 至網站目錄 (如 C:\Inetpub\Scripts)
    • IIS 管理員 → 虛擬目錄 → 執行權限:Scripts and Executables
    • 應用程式對應:副檔名 .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)。新專案強烈建議:

  • ASP.NET Core:跨平台、高效能、依賴注入、中介軟體管線、OpenID Connect 整合
  • Node.js / Go / Java Spring Boot:成熟生態、容器化部署、微服務友善
  • IIS 當反向 Proxy:web.config aspNetCore / httpPlatform 模組轉發至 Kestrel/HTTP.sys

僅在維護舊系統、特殊效能需求 (零開銷原生呼叫)、或嵌入式 Windows 環境時考慮 ISAPI。

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