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