ISAPI开发介绍
?????????主要介紹ISAPI的作用、ISAPI在IIS7上的配置、開發ISAPI的基本內容及使用VS?2008配置ISAPI?DLL開發項目。
?
一、ISAPI介紹
?
縮寫詞=Internet?Server?Application?Programming?Interface為Microsoft所提的Internet?server的API?。
ISAPI分為兩種:ISAPI?extension?(ISAPI擴展)和?ISAPI?filter?(ISAPI篩選器)。
1、ISAPI?服務器擴展是可以被?HTTP?服務器加載和調用的?DLL。ISAPI擴展(extension)也稱為?Internet?服務器應用程序?(ISA),用于增強符合?Internet?服務器?API?(ISAPI)?的服務器的功能。ISAPI擴展(extension)通過瀏覽器應用程序調用,并且將相似的功能提供給通用網關接口?(CGI)?應用程序。
2、ISAPI?篩選器是在啟用?ISAPI?的?HTTP?服務器上運行的?DLL,用以篩選與服務器之間來回傳送的數據。該篩選器注冊事件的通知,例如登錄或?URL?映射。當發生選定事件時,篩選器被調用,并且您可以監視及更改數據(在數據從服務器傳輸到客戶端或相反的過程中)。可以使用?ISAPI?篩選器提供增強的?HTTP?請求記錄(例如,跟蹤登錄到服務器的用戶)、自定義加密、自定義壓縮或其他身份驗證方法。
?
二、ISAPI導出函數
?
1.????ISAPI擴展(ISAPI?extension)導出函數:
1、BOOL?WINAPI?GetExtensionVersion(?HSE_VERSION_INFO??*pVer);
該函數是擴展DLL文件第一次被加載到站點處理進程時被調用。
2、DWORD?WINAPI?HttpExtensionProc(?LPEXTENSION_CONTROL_BLOCK??lpECB);
該函數是IIS服務每次觸發ISAPI擴展時所調用的函數。也就是IIS服務增強服務時具體的實現內容通過本函數的調用。
3、BOOL?WINAPI?TerminateExtension(?DWORD??dwFlags);
該函數是ISAPI擴展DLL文件從進程中被載時調用一次。
2.????ISAPI?篩選器(ISAPI?filter)導出函數
1、BOOL?WINAPI?GetFilterVersion(?PHTTP_FILTER_VERSION?pVer);?
該函數是DLL篩選器第一次被加載到站點處理進程時被調用。
2、DWORD?WINAPI?HttpFilterProc(PHTTP_FILTER_CONTEXT?pfc,DWORD?notificationType,LPVOID?pvNotification);
該函數用于響應注冊在?GetFilterVersion?的形參PHTTP_FILTER_VERSION?中的dwFlags通知事件。根據所注冊的通知事件進行相應的篩選處理。
3、BOOL?WINAPI?TerminateFilter(DWORD?dwFlags);
該函數是DLL篩選器被站點處理進程卸載時時所調用的處理。
?
三、使用Visual?Studio創建ISAPI項目
?
在Visual?Studio?2008的版本及以后版本中,Visual?C++的創建項目類別中,不再有關于ISAPI擴展和ISAPI篩選器的直接項目相關的創建選項。因此在VS2008中的Visual?C++創建項目類別中,選擇“Win32項目”的項目類別,然后根據“添加新項目”向導中的應用程序類別下的“DLL”并選擇“空項目”復選框來創建一個?空白的dll項目,并且由此配置成ISAPI擴展和ISAPI篩選器的dll項目。
1.???????創建空白的DLL項目步驟
1)打開“Visual?Studio2008”,選擇VS界面主菜單上的“文件(F)”菜單項,選擇“新建(N)”菜單項下的“項目(P)”菜單,打開“新建項目”對話框。
2)選擇“新建項目”對話框中的項目類型中的“Visual?C++”樹節點下的“Win32”節點;
3)在右邊的“模板”框中,選擇”Win32項目”,然后填寫相關的名稱、位置、解決方案名稱等信息后“確認”,打開“Win32應用程序向導”對話框;
4)點擊打開的“Win32應用程序向導”對話框中的下一步,選擇應用程序類別“DLL”,選擇附加選項“空項目”,“確定”完成新項目創建。
?
2.???????配置空白DLL項目生成ISAPI擴展(ISAPI?Extension)?DLL。
步驟1:右擊項目,使用“添加”菜單下的“新建項…”菜單項,使用“添加新項”添加C++文件;
步驟?2:在新建的cpp文件中,#include?<httpExt.h>并實現三個導出函的定義;
步驟?3:右擊項目,使用“添加”菜單下的“新建項…”菜單項添加模塊定義文件,這時,模塊定義文件會自動被配置到“DLL項目”屬性下的“鏈接器”—“輸入”配置項中的模塊定義文件下;
步驟?4:在定義模塊文件中,編寫導出函數定義;如:
LIBRARY????"MyISAPIExtension"
EXPORTS
???????????GetExtensionVersion???????@1
???????????HttpExtensionProc???????????@2
????????????????????TerminateExtension?????????@3
(備注:三個導出函數被導出的時候不能被VC++編譯器導出后函數名發生改變,所以使用定義模塊文件對三個文件進行導出。或許可以使用extern?“C”?l加__declspec(dllexport)對三個導出函數進行導出操作;)
?
3.???????配置空白DLL項目生成ISAPI篩選器(ISAPI?Filter)?DLL。
(同配置生成ISAPI?擴展一樣,只是將ISAPI擴展的包含的頭文件及三個篩選器導出函數配置替換成ISAPI篩選器的頭文件httpfilt.h及三個篩選器導出函數的配置。)
?
四、在IIS7上ISAPI?的應用設置
1、??ISAPI擴展(ISAPI?extension)的使用配置。
????????預先配置:
????????需要在IIS7的”?Internet信息服務(IIS)管理器”上的全局配置中的“ISAPI和CGI限制”添加設置允許ISAPI模塊文件路徑;或設置“ISAPI和?CGI限制”配置頁面上右上角的“編輯功能設置”,選擇“允許未指定的ISAPI模塊”以確保要添加的ISAPI模塊不會被禁用。
(1)???????文件擴展名映射處理配置
1)?????????打開IIS7的”?Internet信息服務(IIS)管理器”,點擊所要配置的站點;
2)?????????在打開的站點配置主頁的IIS組中選擇“處理程序映射”,打開處理程序映射的配置頁;
3)?????????在管理器窗口的右上角有個“操作”欄,選擇“添加模塊映射”。(該站點必須是綁定集成管道的應用程序池);
4)?????????在“添加模塊映射”窗口的模塊中選擇“IsapiModule”,然后選擇dll文件,并填寫相應的配置信息;
5)?????????點擊“請求限制…”按鈕,選擇“請求限制”對話框中的“訪問”選項卡下的“執行”單選項,然后確定;
6)?????????最后“確認”添加映射模塊。
(2)???????URL調用ISAPI擴展(ISAPI?extension)方式設置,
調用如,在瀏覽器中直接輸入:?http://www.bizcn.com/MyIsapiExt.dll?進行isapi擴展的調用
如果按照“預選配置”的內容配置完”ISAPI和CGI限制”的配置內容之后,按以下步驟進行操作:
1)???????打開IIS7的”?Internet信息服務(IIS)管理器”,點擊所要配置的站點;
2)???????選擇站點配置主頁下的IIS配置組中的“處理程序映射”,打開站點的“處理程序映射”頁;
3)???????選擇站點的“處理程序映射”配置頁的右邊“操作”欄中的“編輯功能權限”,打開“編輯功能權限”對話框;
4)???????在“編輯功能權限”對話框中,選擇“腳本”和“執行”兩個復選框。
2、??ISAPI篩選器(ISAPI?filter)的使用配置
????????選擇要添加篩選器的站點,在站點的配置主頁,選擇“IIS”分組中的“ISAPI篩選器”。然后,在“ISAPI篩選器”的配置頁面中右邊的“操作”欄中點“添加…”;選擇要配置的篩選器的DLL文件,填寫相關的配置信息,然后確認添加。
?(需要非常注意的一點是:你需要非常注意你的IIS的應用程序池帳戶是否有對于ISAPI所在路徑及ISAPI所要使用到的資源的各種權限。)
五、調試ISAPI??
1、???????調試操作步驟?
????????因為ISAPI是一個dll文件,而且ISAPI是由IIS應用程序池進程調用的。
????????在IIS6?及IIS7的應用程序池的進程名稱都是w3wp.exe;我們需要在單個應用程序池的機子上部署環境進行調試。避免調試時,多個應用程序池的一樣的?w3wp.exe進程名稱,導至不必要的調試麻煩。以下是進行ISAPI進行調試的操作步驟(ISAPI擴展和ISAPI?篩選器的調試方式一樣):
步驟1?:根據isapi的應用設置設置好要測試的isapi的dll;
步驟2?:在瀏覽器的地址欄中輸入配置測試isapi?dll的站點的URL,然后過行一次訪問,以便站點響應處理進程加載isapi?dll文件。(如果是URL的方式訪問isapi擴展的話,就要輸入完整的isapi擴展dll訪問的url);
步驟?3?:打開要測試的ISAPI的dll項目;
步驟?4?:選擇主菜單的“工具”菜單下的“附加到進程…”的菜單項,彈出“附加到進程”對話框;
步驟?5?:選擇“附加到進程”對話框下邊的“顯示所有會話中的進程”復選框,然后按“刷新”按刷;
步驟?6?:?在“可用進程”的列表中選擇進程為:w3wp.exe的進程,最后按“附加”,將w3wp.exe進程附加到項目調試中;
步驟?7?:然要測試的ISAPI?dll的函數HttpExtensionProc(或HttpFilterProc)內打上斷點,再次刷新剛才在瀏覽器地址欄中輸入的URL地址;這時程序就會停在打上斷點的地方。
?
2、不能調試的可能情況:
a)?????????如果所編寫的ISAPI中出現異常錯誤;可能直接導致應用程序停止進行。
b)?????????導出函數不是按原來的函數名導出,可能是編譯的時候被VC++編譯器改變函數名了。
c)?????????導出函數沒有被正常導出。可以使用查看的dll導出函數工具進行查看導出的函數。
?????????……
總結