建立ISAPI擴充套件?

Tags: 函式, 程序,

本節介紹如何使用ISAPI擴充套件建立動態內容。ISAPI擴充套件以CGI方式提供相同功能,但是比CGI,ASP,呼叫COM+ 元件的檔案執行速度更快。詳細的資訊請參閱 ISAPI擴充套件。IIS SDK平臺部分包含完整示例程式碼和有用工具。這些程式碼示例可以通過網路從SDK平臺更新中下載。本節包含大部分示例程式碼來自完整示例程式碼。

本節內容

這個部分包含以下主題:

o ISAPI應用程式設計

o 實現所需ISAPI擴充套件函式

o 建立一個簡單的ISAPI擴充套件

o 使用ISAPI擴充套件回撥函式

o 呼叫 HSE_REQ_EXEC_URL 和 HSE_REQ_EXEC_UNICODE_URL

o 從ISAPI擴充套件中傳送響應報頭

o ISAPI擴充套件中使用非同步I/O處理

o 攔截IIS所有傳入請求

o 使用萬用字元應用程式重新對映URL

o 使用萬用字元應用程式對映實現自定義身份驗證

o 在ISAPI應用中獲取伺服器變數

o 控制ISAPI擴充套件標識

o 在ISAPI擴充套件中使用 HSE_REQ_SEND_URL_REDIRECT_RESP 重定向

o 除錯 ISAPI應用程式

ISAPI擴充套件設計問題.

本主題提供有關設計ISAPI擴充套件時應該思考的問題:

程序隔離

由於ISAPI DLL擴充套件以IIS方式載入到相同程序,ISAPI擴充套件可能存在訪問衝突和其它bugs導致IIS崩潰。因此,所有ISAPI擴充套件都應該徹底測試以確保完整性。這樣做有一種方法,將不可信DLL執行在單獨程序以程序外標記應用程式方式放置擴充套件。這麼做將導致IIS使用程序隔離技術,在IIS主程序外執行ISAPI DLL。IIS為這種外部過程執行故障檢測和恢復。

狀態維護

ISAPI擴充套件通常在GetExtensionVersion函式入口點進行初始化。此外,使用Visual C++開發DLL, entry/exit 函式(通常是DllMain)也會產生初始化。和任何Win32 DLL一樣,當擴充套件通過IIS第一次DLL載入/解除安裝時 c 執行時庫呼叫 entry/exit 函式,在程序中一個新執行緒(除了主執行緒)被建立或銷燬。

這樣做的好處是,使用DLL自身維護統計與DLL有關係的任何資訊。通過建立表單,它使DLL效能測量成為可能;資訊可整合到系統性能計數器,方便使用 SysMon。此外,EXTENSION_CONTROL_BLOCK 結構的 lpszLogData 成員可用於伺服器日誌上記錄資料。

語言和框架選擇

IIS SDK示例使用C或C++開發,未使用微軟基礎類庫(MFC)。MFC庫提供一個物件模型及更友好向導方便建立ISAPI擴充套件。提供類集如 CHttpServer,CHttpServerContext,和CHtmlStream支援。更多MFC相關資訊,請參閱 MFC庫和Visual C++ SDK。

執行緒安全設計和執行緒同步

由於所有(程序內)請求,與DLL使用相同方式對映到IIS程序空間進行處理,所以必須使用執行緒安全程式和架構設計和實現ISAPI擴充套件。這尤其重要,若擴充套件依賴於全域性狀態資訊或結構,如輔助執行緒工作佇列。

作業系統序列化呼叫DLL的 entry/exit 函式 DllMain。使用執行緒同步實現序列化,存在內部互動問題。最好DllMain內部避免使用或請求執行緒同步機制(包含一些 Win32 WaitFor...函式)。

有關編寫多執行緒安全 DLL 的更多資訊,請參閱平臺SDK 程序和執行緒,或Win32 高階程式設計書籍。

報告不健康狀態

ISAPI擴充套件應用可以建立程式設計訊號以方便回收。可以通過使用新的 ServerSupportFunction 呼叫 HSE_REQ_REPORT_UNHEALTHY 實現。請注意程式等級是指定ISAPI程式介面。ASP或ASP.NET程式碼不能實現這種邏輯型別。這個功能僅對執行在工作程序隔離模式的ISAPI擴充套件有效。

若要 HSE_REQ_REPORT_UNHEALTHY 使用有效,IIS 伺服器必須開啟 pinging 操作,執行程序管道應用(即如果它不健康,運用 Ping 來請求回收)WAS(配置與程序管理) 檢測ISAPI訊號,確定不健康狀態。ISAPI必須實現一些內部機制用於確定其不健康狀態,如監視內部執行緒池狀態。

註釋:這型別程式會導致正在執行ISAPI擴充套件的程序關閉。此外,所有工作程序中執行的應用將重啟。ASP的ISAPI擴充套件實現這個功能的高階邏輯,監視內部執行緒池狀態。若太多執行緒處於阻塞狀態,將標記回收。

下面是使用 HSE_REQ_REPORT_UNHEALTHY 程式碼示例演示:

DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB)

{

// ...

fResult = pECB->ServerSupportFunction(

pECB->ConnID,

HSE_REQ_REPORT_UNHEALTHY,

szReason,

NULL,

NULL);

// ...

}

VectorSend(HSE_REQ_VECTOR_SEND)函式

IIS 6.0版本以前,若 ISAPI 開發人員擁有多個緩衝區來組成一個響應,他們只有兩種可能作法。他們可呼叫 WriteClient 多次,或在一個大型緩衝區內組合出響應。

" 第一種作法會造成效能瓶頸,因為每個緩衝區都有一個核心模式轉變。

" 第二種作法不僅會影響效能,還需要額外的記憶體。VectorSend 是 IIS 6.0 解決此問題的方式。

VectorSend 實作成 ISAPI 的伺服器支援功能,可讓開發人員將一群緩衝區和檔案控制代碼放在一起,以便依序傳送,接著交由 IIS 6.0 編譯出最後的響應。HTTP.sys 會將所有的緩衝區和/或檔案控制代碼編譯到核心內的一個響應緩衝區,接著傳送它。如此,ISAPI 就不用建立緩衝區處理此工作或多次 WriteClient。

相關問題答案