ISAPI擴充初窺

來源:互聯網
上載者:User

從CGI說起…

話說CGI(Common Gateway Interface)通用網管介面是一項古老的動態網頁交換技術,CGI程式通過對請求資訊的解析,可以產生相應的處理,例如它可以在伺服器端實現表格處理、資料查詢、寄送電子郵件等操作,並最終將處理後的資訊返回給用戶端瀏覽器,CGI技術可以說是動態網頁技術的鼻祖,它在剛出道之際也是風靡一時,至今的許多應用仍然能夠看到CGI的身影。然而就像許多技術一樣,CGI本身也不可避免的具有一定的缺陷。當你在使用C、C++、甚至Perl語言在伺服器端編寫完成你的EXE程式並關聯到相應請求後,每次的這個請求都會在記憶體中載入執行你的EXE程式,甚至是某個使用者不斷的開啟同一個頁面也是如此,重複的載入執行會消耗大量的記憶體,當類似這樣的並發請求增多時,極容易造成伺服器的崩潰。此外一個相對複雜的CGI程式本身的開發對於用慣了.net java的程式來說也是一個痛苦的過程。於是CGI唯一的優勢似乎就剩下了較高的運行效率(接近於底層)。

缺陷怎麼辦?

作為CGI的一個替代品,ISAPI擴充提供了與CGI程式相似的功能,不同的是它通過給其宿主進程(例如IIS)提供三個規範的介面來保證其本身只在記憶體中裝載一次,也即是說不管有多少用戶端在同一時間請求,它只執行個體化一次。從而避免了像CGI那樣大量的記憶體消耗。至於具體的介面會在下文中介紹。

什麼是ISAPI?

好了,說了那麼半天廢話,我們的主角終於華麗的登場了—ISAPI,全稱是Internet Server Application Programming Interface(Internet伺服器應用編程介面)它為開發人員提供了更加強大的對於IIS功能的擴充,這也就是我們常說的ISAPI擴充。ISAPI本身並沒有受限於IIS,相反它為IIS提供了更高的靈活性與擴充。

ISAPI與IIS是如何協同工作的呢?

考慮到效能原因,ISAPI和調用它的IIS是在同一個進程中的,這使得它們彼此間的可以共用某些資料,從而大大提高了相互訪問的速度,但這種直接存取使得ISAPI本身出現錯誤時很可能也影響到IIS,導致IIS伺服器癱瘓。於是ECB便應運而生,ECB的全稱是Extension Control Block 它是一個非託管資源套件,具有對ISAPI介面完整的訪問能力,如用於表單變數的輸入資料流和用於回寫資料到用戶端的輸出資料流。當IIS接受到一個web請求後,首先調用自身的ProcessRequest函數進行處理,這個函數通過傳遞一個ECB的指標來間接的操作ISAPI。可以說ECB是最初接觸到Managed 程式碼的入口和出口。

ISAPI到底做了哪些事?

我們不妨類比一個web請求看看ISAPI到底是經曆了那些步驟,做過哪些處理。假設一個使用者正在瀏覽器中輸入類似http://www.mydomain.com/script/example.dll?ID=p05874 & Tx=870250AZT6這樣的網址並點擊斷行符號,請求經過通過N層協議的轉換經過N次路由終於來到了伺服器端(假設我們使用的是IIS伺服器),伺服器首先檢查example.dll是否已經裝在到記憶體中,如果尚未裝在,並首先初始化該DLL並新啟動一個進程,一旦該DLL已經載入記憶體,一個用於管理ISAPI擴充的線程便啟動了,在調用入口函數DLLMain之後,調用了一個叫做GetExtensionVersion的函數來執行如下兩項工作:

  1. 交換版本資訊(Exchange version information)。
  2. 得到一個關於該擴充的文本描述。

在此之後,IIS伺服器通過之前提到的ECB指標調用ISAPI擴充中的一個稱作HttpExtensionProc的函數,該函數的任務是將處理過後的資料寫回到用戶端。第三步同時也是最後一步就是在擴充從記憶體中卸載之前執行TerminateExtension操作。所有的資源將會在這個函數中釋放。

現在,我們再來簡單回顧一下ISAPI擴充向web伺服器暴露的三個介面:

  1. GetExtensionVersion
  2. HttpExtensionProc
  3. TerminateExtension(可選擇)

關於ISAPI過濾器(Filter)

再簡單介紹一下ISAPI過濾器,內容來自於MSDN。ISAPI 篩選器是在啟用 ISAPI 的 HTTP 伺服器上啟動並執行 DLL,用以篩選與伺服器之間來回傳送的資料。該篩選器註冊事件的通知,例如登入或 URL 對應。當發生選定事件時,篩選器被調用,並且可以監視及更改資料(在資料從伺服器傳輸到用戶端或相反的過程中)。可以使用 ISAPI 篩選器提供增強 HTTP 要求記錄(例如,跟蹤登入到伺服器的使用者)、自訂加密、自訂壓縮或其他驗證方法。

參考:

  1. http://www.codeproject.com/isapi/isapi_extensions.asp
  2. http://www.cnblogs.com/tmfc/archive/2006/08/29/489779.aspx
  3. http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_internet_server_api_.28.isapi.29_.extensions.asp

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.