|
|
|
|
|
在IIS設置里,有一項是: ISAPI 和 CGI 限制。我由此想到的是 ISAPI 和 CGI 的區(qū)別在哪?它們的執(zhí)行方式又有何不同?
在比較兩者之前,我們需先了解下它們的含義。對于 ISAPI,我們可以從上一篇文章中描述到的 ISAPI 概述中得以了解。CGI,是 Common Gateway Interface 的簡稱,是外部應用程序(CGI程序)與WEB服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的過程。CGI規(guī)范允許Web服務器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器,CGI將Web的一組簡單的靜態(tài)超媒體文檔變成一個完整的新的交互式媒體。絕大多數的CGI程序被用來解釋處理來自表單的輸入信息,并在服務器產生相應的處理,或將相應的信息反饋給瀏覽器。CGI程序使網頁具有交互功能。
ISAPI和CGI比較
ISAPI(Internet 服務器應用程序編程接口)模型被發(fā)展成為CGI(通用網關接口)更快地替代方案。ISAPI提供比CGI更多優(yōu)越性,包括低開銷、更快加載時間和更好的可伸縮性。CGI和ISAPI編程模型主要區(qū)別是實現(xiàn)方法不同。
傳統(tǒng)CGI,系統(tǒng)對于每個請求,將創(chuàng)建唯一進程。當http server每次收到一個請求時,都將啟動一個新進程。對于cgi請求大量資源,操作系統(tǒng)必須保持這些進程。因固有限制,很難開發(fā)出靈活高效的互聯(lián)網應用。
使用ISAPI,不需要單獨進程。使用線程隔離和同步工作項目。
ISAPI 擴展執(zhí)行以下操作:
1)接收數據放入 EXTENSION_CONTROL_BLOCK 結構成員lpbData中,而不是通過標準輸入(stdin)進程令牌讀取數據
2)使用 WriteClient 函數將數據發(fā)送回客戶端,而不是通過標準輸出(stdout)進程令牌發(fā)送數據。
3)通過 EXTENSION_CONTROL_BLOCK 結構訪問常見cgi變量。對于其它變量,擴展調用GetServerVariable函數。cgi可執(zhí)行文件中通過getenv環(huán)境變量表檢索。
4)使用 WriteClient 函數直接發(fā)送標題或http狀態(tài)碼,或者調用HSE_REQ_SEND_RESPONSE_HEADER_EX ServerSupportFunction,替代 STDOUT 發(fā)送標題
5)位置/URL/標題 重定向。本地url,擴展使用HSE_REQ_SEND_URL結構,而不是寫標頭至STDOUT。若url是遠程或未識別的,擴展使用 ServerSupportFunction 回調函數 HSE_REQ_SEND_URL_REDIRECT_RESP。當iis傳入請求為一個特定擴展時,iis加載dll到內存中,為dll其它傳入請求服務。iis卸載擴展時,若存在TerminateExtension函數調用,使用TerminateExtension可以釋放(鎖定或初始加載期間、Keep-Alive連接)的任何資源。
ISAPI 服務器擴展為使用 Internet 服務器的通用網關接口 (CGI) 應用程序提供了另一種選擇。與 CGI 應用程序不同,ISA 在 HTTP 服務器所在的同一地址空間運行,并且可以訪問可由 HTTP 服務器使用的所有資源。ISA 的系統(tǒng)開銷比 CGI 應用程序低,因為它們不要求創(chuàng)建其他進程,也不執(zhí)行需要越過進程邊界的通信,而這種通信非常耗時。如果內存被其他進程所需要,擴展和篩選器 DLL 都可能被卸載。
Internet 客戶端通過 HTTP 服務器調用 ISA 的方法與調用 CGI 應用程序的方法一樣。例如,客戶端可以這樣調用一個 CGI 應用程序:
http://sample/example.exe?Param1
它可以這樣調用一個執(zhí)行相同功能的 ISA:
http://sample/example.dll?Param1
ISAPI 允許在一個 DLL 中有多個命令,這些命令作為 DLL 中 CHttpServer 對象的成員函數來實現(xiàn)。CGI 要求每個任務有一個單獨的名稱和一個到單獨的可執(zhí)行文件的 URL 映射。每個新的 CGI 請求啟動一個新進程,而每個不同的請求包含在各自的可執(zhí)行文件中,這些文件根據每個請求加載和卸載,因此系統(tǒng)開銷高于 ISA。
ISAPI 篩選器沒有等效的 CGI 篩選器。篩選器提供預處理和后處理在客戶端和服務器之間發(fā)送的所有數據的能力。