技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營

贊助商

分類目錄

贊助商

最新文章

搜索

IIS里ISAPI擴(kuò)展與ISAPI篩選器的區(qū)別和相同之處

作者:admin    時(shí)間:2017-4-7 8:43:36    瀏覽:

我們用IIS搭建網(wǎng)站時(shí),會看到兩個地方的設(shè)置:ISAPI 篩選器、ISAPI 擴(kuò)展。其中 ISAPI 篩選器我們一般用不到,而 ISAPI 擴(kuò)展我們就很可能要用到,比如搭建php環(huán)境時(shí)就要用到 ISAPI 擴(kuò)展。親自搭建過php環(huán)境的人可能已經(jīng)對 ISAPI 擴(kuò)展有了一定的了解,但是對于 ISAPI 篩選器還可能未曾去了解過。我們在什么情況下要用到 ISAPI 篩選器呢?ISAPI 擴(kuò)展與 ISAPI 篩選器的區(qū)別是什么呢?它們又有什么不同之處?這些都是本文要探討的問題。

在討論問題之前,我們先來了解一下 ISAPI 擴(kuò)展。

ISAPI擴(kuò)展概述

ISAPI 擴(kuò)展是運(yùn)行在IIS上并有權(quán)訪問其提供所有函數(shù)的真實(shí)應(yīng)用程序。典型 ISAPI 擴(kuò)展示例: ISAPI 擴(kuò)展通過調(diào)用Asp.dll進(jìn)行ASP頁面處理。通常情況下,ISAPI 擴(kuò)展與客戶端訪問靜態(tài)HTML文件或動態(tài)ASP文件方式相同。

ISAPI 擴(kuò)展以 DLL 形式被IIS加載到進(jìn)程空間中??蛻舳嗽赨RL請求中指定其名稱激活 ISAPI 擴(kuò)展并調(diào)用文件系統(tǒng)中虛擬可執(zhí)行目錄下的dll文件。

使用 ISAPI 可以開發(fā)兩種類型應(yīng)用程序:擴(kuò)展和過濾器。ISAPI擴(kuò)展與HTML、ASP請求運(yùn)行方式相同。由于ISAPI應(yīng)用程序使用編譯方式,所以處理速度比Asp文件或調(diào)用COM+組件的文件處理快。

擴(kuò)展和過濾器可以使用C或C++開發(fā)。Visual Studio包含ISAPI向?qū)Ъ涌扉_發(fā)。

應(yīng)用程序映射

Web Server請求應(yīng)用程序映射(或腳本映射)方式與Windows中相同。如當(dāng)你打開一個以".txt"結(jié)尾的文件,因?yàn)門XT文件映射至Notepad.exe,所以在記事本中打開。

ISAPI擴(kuò)展通過調(diào)用ASP.dll處理Asp函數(shù)。任何以.asp文件結(jié)尾的請求在被輸出至客戶端窗口顯示前都將被iis服務(wù)器映射至asp.dll。

客戶端請求ISAPI擴(kuò)展方式如下:

http://Server_name/ISAPI_name.dll/Parameter

請求asp文件,客戶端URL請求如 http://Server_name/ASP.dll/File_name.asp 由于asp被%windir%\system32\inetsrv\ASP.dll 的擴(kuò)展處理。為簡化asp請求,iis使用腳本映射.asp與ASP.dll擴(kuò)展。http://Server_name/File_name.asp 的請求接獲時(shí),iis運(yùn)行asp.dll 服務(wù)請求加載處理文件。iis上應(yīng)用程序都通過腳本進(jìn)行特定文件名與擴(kuò)展映射。

ISAPI 擴(kuò)展處理順序

當(dāng)iis接收請求映射至擴(kuò)展時(shí),將發(fā)生如下事件:

1、如果不是已經(jīng)在內(nèi)存中,IIS 將加載 DLL。當(dāng)加載 DLL 時(shí),Windows 將自動調(diào)用 entry/exit 函數(shù) (通常為 DllMain)。然后調(diào)用擴(kuò)展的 GetExtensionVersion 入口點(diǎn)函數(shù)。

2、iis 對傳入請求進(jìn)行預(yù)處理

3、iis 通過擴(kuò)展傳遞請求數(shù)據(jù)和回調(diào)函數(shù) 創(chuàng)建和填充 EXTENSION_CONTROL_BLOCK 結(jié)構(gòu)

4、.iis 調(diào)用 HttpExtensionProc 函數(shù),傳遞一個指針到 EXTENSION_CONTROL_BLOCK 結(jié)構(gòu)創(chuàng)建該請求

5、執(zhí)行更多isapi擴(kuò)展操作:如從客戶端讀取更多數(shù)據(jù)(post操作),或向客戶端寫標(biāo)題和數(shù)據(jù)

6、通過HttpExtensionProc 函數(shù)完成擴(kuò)展信息處理。同步操作,函數(shù)返回HSE_STATUS_SUCCESS返回代碼;異步操作,返回代碼是HSE_STATUS_PENDING .如需有關(guān)異步操作的信息,請參閱異步I/O處理

7、iis執(zhí)行清理請求連接,若 Keep-Alive 請求未啟用,將關(guān)閉這個連接

8、不再需要ISAPI擴(kuò)展時(shí),IIS 若提供 TerminateExtension 函數(shù),則調(diào)用執(zhí)行。如果IIS配置為緩存ISAPI擴(kuò)展,則不調(diào)用TerminateExtension 函數(shù),直到IIS web 服務(wù)器關(guān)閉或重啟。

注釋:不要求每個請求調(diào)用GetExtensionVersion。相反,ISAPI 擴(kuò)展對于每個請求只調(diào)用一次HttpExtensionProc。此外,EXTENSION_CONTROL_BLOCK結(jié)構(gòu)用于每個傳入請求。

 ISAPI 篩選器和 ISAPI 擴(kuò)展的屬性設(shè)置

我們先來看看 ISAPI 篩選器和 ISAPI 擴(kuò)展的屬性在哪設(shè)置,如下面兩圖所示: 

ISAPI篩選器

▲ ISAPI 篩選器

ISAPI擴(kuò)展

▲ ISAPI 擴(kuò)展

ISAPI 擴(kuò)展和 ISAPI 篩選器是如何被調(diào)用的?

Internet 服務(wù)器擴(kuò)展 (ISA) 是您為擴(kuò)展服務(wù)器功能而編寫的程序。當(dāng)某客戶端發(fā)送請求調(diào)用 DLL 的 URL 從而顯式請求調(diào)用 ISA 時(shí),將調(diào)用 ISA。例如,http://yourserver/wwwquote.dll? 請求名為 yourserver 的服務(wù)器運(yùn)行 DLL wwwquote。當(dāng)用戶單擊 Web 頁上的按鈕時(shí),也會發(fā)送 HTTP 請求。當(dāng) Web 頁作為收集信息的窗體,而這些信息作為參數(shù)傳遞給 DLL 時(shí),經(jīng)常使用這種方法。例如,http://yourserver/wwwquote.dll?Issues?Method=ByCUSIP 調(diào)用 DLL 并將參數(shù) Method=ByCUSIP 傳遞給函數(shù) Issues。

相反,每次指定的事件發(fā)生時(shí)都調(diào)用 ISAPI 篩選器,無論服務(wù)器正在處理什么請求。如果包括了 SF_NOTIFY_URL_MAP(用于 URL 映射的標(biāo)記),那么在請求通知時(shí),每次 URL 映射到服務(wù)器時(shí)都將調(diào)用 OnURLMap 函數(shù),與 URL 命令的內(nèi)容無關(guān)。篩選器可以根據(jù)對服務(wù)器的每個請求來處理、檢查和更改數(shù)據(jù)。

ISAPI 擴(kuò)展和 ISAPI 篩選器的區(qū)別是什么?

服務(wù)器擴(kuò)展: 篩選器:
在 URL 中引用時(shí)運(yùn)行。 為服務(wù)器處理的每個 URL 調(diào)用。
被顯式調(diào)用,例如用 http://myserver/myprog.dll?。 如果發(fā)生已注冊事件,自動為任何發(fā)送到服務(wù)器的 URL 運(yùn)行。
被用戶第一次調(diào)用時(shí)根據(jù)請求加載。 服務(wù)因其注冊表項(xiàng)而啟動時(shí)加載。

ISAPI 擴(kuò)展和 ISAPI 篩選器的相同之處

ISAPI 擴(kuò)展和 ISAPI 篩選器都:

  • 共享服務(wù)的處理空間。
  • 必須是線程安全的。
  • 一經(jīng)加載便保留在內(nèi)存中(直到服務(wù)停止或者內(nèi)存被其他進(jìn)程所需要)。

ISAPI 篩選器和 ISAPI 擴(kuò)展可以在同一 DLL 中嗎?

在同一 DLL 中可以有一個篩選器(如果需要,可接收多個通知)和一個服務(wù)器擴(kuò)展。這在篩選器和服務(wù)器擴(kuò)展彼此相關(guān)時(shí)會很有用。例如,您可能希望在將數(shù)據(jù)發(fā)送到客戶端之前執(zhí)行數(shù)據(jù)的后處理,以便自定義特定瀏覽器的外觀。另一個實(shí)例是在篩選器和擴(kuò)展之間通信。可以將篩選器和應(yīng)用程序放在同一 DLL 中,并在篩選器 SF_NOTIFY_PREPROC_HEADERS 通知期間添加一個鍵值標(biāo)題。應(yīng)用程序可以通過查找相應(yīng)的上下文獲取此鍵。

關(guān)于在 IIS 上使用 ISAPI 有哪些編程提示?

本文討論針對在 Microsoft Internet 信息服務(wù) (IIS) 上運(yùn)行 ISAPI 擴(kuò)展或篩選器的編程提示。如果在其他支持 ISAPI 的 Web 服務(wù)器上運(yùn)行,這些服務(wù)器可能以不同的方式處理注冊表項(xiàng)、內(nèi)存和應(yīng)用程序的加載。有關(guān)更多信息,請參見您正在使用的 Web 服務(wù)器的文檔。

從 IIS 1.0 開始,ISAPI 篩選器在該服務(wù)啟動時(shí)加載,并且直到該服務(wù)停止時(shí)才卸載。ISAPI 服務(wù)器擴(kuò)展在第一次被調(diào)用時(shí)加載并保留在內(nèi)存中,直到服務(wù)關(guān)閉或者內(nèi)存被其他進(jìn)程需要為止。由于 DLL 將長時(shí)間保留在內(nèi)存中,因此需考慮何時(shí)分配資源、何時(shí)解除分配資源以及何時(shí)同數(shù)據(jù)源等資源連接或斷開連接。

如何安裝 ISAPI 篩選器或 ISAPI 擴(kuò)展的新版本?

若要安裝篩選器或 ISA 的新版本,必須關(guān)閉該服務(wù)、將 DLL 復(fù)制到適當(dāng)?shù)哪夸洝⒏伦员恚ㄈ绻切碌暮Y選器)并重新啟動該服務(wù)。

何時(shí)加載或卸載 DLL?

注冊表項(xiàng) HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/FilterDLLs 控制該服務(wù)啟動時(shí)加載的篩選器。它包含一個以逗號分隔的篩選器列表,其中包含它們的完整路徑。若要加載其他篩選器,請停止該服務(wù),將篩選器添加到注冊表并重新啟動該服務(wù)。

ISAPI 擴(kuò)展在第一次被客戶端調(diào)用時(shí)加載。

該服務(wù)啟動后,篩選器將保留在內(nèi)存中,直到關(guān)閉計(jì)算機(jī)或該服務(wù)為止。同樣,服務(wù)器擴(kuò)展一經(jīng)加載便可能保留在內(nèi)存中,直到關(guān)閉計(jì)算機(jī)或該服務(wù)為止。通過指定注冊表設(shè)置 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/CacheExtensions=0,可以強(qiáng)制重新加載擴(kuò)展 DLL(例如,出于調(diào)試的目的)。此設(shè)置直到該服務(wù)重新啟動時(shí)才生效。注意此設(shè)置應(yīng)該只在調(diào)試時(shí)使用。它對性能有負(fù)面影響,決不要在生產(chǎn)服務(wù)器上使用。

有哪些內(nèi)存和資源注意事項(xiàng)?

我的應(yīng)用程序必須是線程安全的嗎?

是的。ISAPI 是作為 Web 服務(wù)器的一部分運(yùn)行的。在像 Microsoft Internet 信息服務(wù)這樣的多線程服務(wù)器上,您的應(yīng)用程序在 Windows NT 服務(wù)的上下文中運(yùn)行。您的應(yīng)用程序可能從不同的線程同時(shí)被調(diào)用多次。數(shù)據(jù)必須受臨界區(qū)的保護(hù)。
如何為處理同時(shí)請求進(jìn)行計(jì)劃?

ISAPI DLL 支持多個同時(shí)請求,確保臨界數(shù)據(jù)受到保護(hù)是 ISAPI DLL 開發(fā)人員的責(zé)任。

Web 服務(wù)器天生可以同時(shí)處理多個請求。您的應(yīng)用程序加上許多其他應(yīng)用程序都將一直使用此服務(wù)器。在像 www.microsoft.com 這樣的繁忙站點(diǎn)和一些流行的搜索引擎上,每天都可以看到數(shù)百萬用戶的客戶端通信量。用戶希望得到快速響應(yīng),如果響應(yīng)時(shí)間過長他們將取消請求。

正如前面提到的,應(yīng)用程序是線程安全的。除非需要,否則一定掛斷資源或連接。不要使用全局變量。

當(dāng)收到篩選器通知時(shí):

  1. 快速處理該消息。
  2. 將其繼續(xù)傳遞到下一個篩選器。
  3. 除非需要(例如,如果有一個必須首先運(yùn)行的身份驗(yàn)證篩選器,或者正在提供或預(yù)處理由其他篩選器使用的數(shù)據(jù)),否則不要請求高優(yōu)先級通知。

文章擴(kuò)展

IIS中 ISAPI 擴(kuò)展、ISAPI 篩選器

在IIS的文檔中經(jīng)常會提到兩個術(shù)語:ISAPI擴(kuò)展和ISAPI篩選器。

1、ISAPI 擴(kuò)展

“ISAPI擴(kuò)展(ISAPI Extension)”是一種可以添加到IIS中以增強(qiáng)Web服務(wù)器功能的程序,其載體為DLL文件。通常直接負(fù)責(zé)響應(yīng)HTTP請求。

根據(jù)HTTP請求要訪問的資源擴(kuò)展名(通過URL獲?。?,IIS會選取特定的 ISAPI 擴(kuò)展來處理這一請求,這一過程被稱為“程序映射”。 而用于響應(yīng)HTTP請求的被稱為“HTTP Handler(HTTP處理程序)”。 下圖展示了IIS 6中的程序映射。

ISAPI擴(kuò)展

▲ ISAPI 擴(kuò)展

在圖中可以看到,IIS指定對php網(wǎng)頁(其擴(kuò)展名為.php)的請求將由php5isapi.dll處理。

IIS 7中的程序映射與IIS 6略有不同。當(dāng)IIS 7以“經(jīng)典模式”運(yùn)行時(shí),與IIS 6一樣使用 php5isapi.dll 響應(yīng)針對“.php”的請求。但當(dāng)IIS 7以“集成模式”運(yùn)行時(shí),則使用托管處理程序(System.Web.UI.PageHandlerFactory)響應(yīng)針對“.php”的請求(圖 8?13)。

IIS 7 程序映射

IIS 7 程序映射

2、ISAPI 篩選器

“ISAPI篩選器(ISAPI Filter)”也是一種DLL但不負(fù)責(zé)處理HTTP請求,主要作用是響應(yīng)某些特定的事件。當(dāng)這些事件發(fā)生時(shí) ISAPI 篩選器被調(diào)用,它可以修改傳入或傳出的HTTP數(shù)據(jù)。在IIS 7中,使用“HTTP模塊(HTTP Module)”取代了傳統(tǒng) ISAPI 篩選器的功能。

ISAPI 擴(kuò)展與 ISAPI 篩選器名字很相近,但其在IIS中的地位和所起的作用是不同的。

您可能對以下文章也感興趣

標(biāo)簽: IIS  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */