明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

使用ISAPI過濾器增強(qiáng)IIS的技巧

[摘要]作為一個(gè)WWW服務(wù)器軟件,微軟公司的Internet Infomation Server(IIS)簡單易學(xué),管理方便,得到了廣泛的使用。您還可以通過ISAPI過濾器,進(jìn)行自己定制的處理,來增強(qiáng)IIS...

作為一個(gè)WWW服務(wù)器軟件,微軟公司的Internet Infomation Server(IIS)簡單易學(xué),管理方便,得到了廣泛的使用。您還可以通過ISAPI過濾器,進(jìn)行自己定制的處理,來增強(qiáng)IIS的功能。ISAPI過濾器可以定制以下的處理:接收HTTP協(xié)議頭預(yù)處理、發(fā)送HTTP協(xié)議頭預(yù)處理、發(fā)送生數(shù)據(jù)預(yù)處理、獲得生數(shù)據(jù)預(yù)處理、HTTP會話結(jié)束信息處理、自定義的安全認(rèn)證機(jī)制、URL映射信息處理、日志記錄處理等。靈活利用這些定制處理,您可以完成許多看似難以實(shí)現(xiàn)的功能,得到意想不到的效果。但是ISAPI過濾器使用不當(dāng)也會影響服務(wù)器的性能。


ISAPI過濾器的開發(fā)非常簡單,只需要完成三個(gè)接口DLL函數(shù)即可。它們是GetFilterVersion()、HttpFilterProc()、TerminateFilter(),大家可以查看MSDN了解詳細(xì)的用法。ISAPI過濾器是DLL文件,一般用C/C++語言開發(fā)。為使ISAPI過濾器能夠運(yùn)行,您需要在注冊表的HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\W3SVC\Parameters下建立一個(gè)字符串項(xiàng),其名稱為"Filter Dlls",值為ISAPI過濾器文件的全路徑名稱。若這個(gè)字符串項(xiàng)已經(jīng)存在,只需把它的全路徑名稱加入其中,不同的ISAPI過濾器文件之間用";"分隔,您可以根據(jù)執(zhí)行的優(yōu)先順序加在適當(dāng)?shù)奈恢。設(shè)置好后重新啟動(dòng)IIS服務(wù),您的ISAPI過濾器就發(fā)揮作用了。

下面作者舉一個(gè)具體的應(yīng)用例子。

對訪問內(nèi)容進(jìn)行統(tǒng)計(jì)分析:
通常我們在需要計(jì)數(shù)的頁面內(nèi)放一個(gè)計(jì)數(shù)器,或者使用ASP文件來實(shí)現(xiàn)計(jì)數(shù)功能。這種方法不能適用于如README.TXT等其他非HTML格式的文件。如果使用IIS的日志功能又太占用空間而不方便。作者通過定制URL映射信息處理來跟蹤感興趣的幾個(gè)文件的計(jì)數(shù)統(tǒng)計(jì),將結(jié)果記錄在一個(gè)文件中。

下面是它的源程序。

fcount.def:
LIBRARY fcount
EXPORTS GetFilterVersion
 HttpFilterProc
 TerminateFilter

fcount.c:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <httpfilt.h>

#define logfile "C:\\InetPub\\fcount.log"
#define pages 5
char* urls[] = {
  "/default.htm",
  "/banner.gif",
  "/product/readme.txt",
  "/product/product1.htm",
  "/product/product2.htm"
  };
int counts[pages];

BOOL WINAPI GetFilterVersion
(HTTP_FILTER_VERSION *pVer)
{
int i;

 pVer->dwFilterVersion = HTTP_FILTER_REVISION;
strcpy(pVer->lpszFilterDesc, "fcount");
 pVer->dwFlags = SF_NOTIFY_URL_MAP; /* 過濾的內(nèi)容 */

 for (i=0; i<pages; i++) { /* 從文件讀入初始計(jì)數(shù)值 */
counts[i] = GetPrivateProfileInt("VisitCounter",
urls[i],
0, logfile);
}

 return TRUE;
}

DWORD WINAPI HttpFilterProc
(HTTP_FILTER_CONTEXT *pfc,
 DWORD noteType, VOID *pvNote)
{
 int i;
 char lurl[512];
 char buf[16];

 strcpy(lurl, ((PHTTP_FILTER_URL_MAP)pvNote)
->pszURL);
 _strlwr(lurl);
 for (i=0; i<pages; i++) {
 if (strcmp(lurl, urls[i])==0) {
  counts[i] ++; /* 計(jì)數(shù)值增加 */
  if (counts[i]%10==0) {
/* 當(dāng)計(jì)數(shù)值滿10時(shí)記入文件,
 以免系統(tǒng)突然死掉時(shí)數(shù)據(jù)全部丟失 */
  _itoa(counts[i], buf, 10);
  WritePrivateProfileString("VisitCounter",
 urls[i], buf, logfile);
  }
  break;
 }
 }
 return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

BOOL WINAPI TerminateFilter(DWORD dwFlags)
{
 int i;
 char buf[16];

 for (i=0; i<pages; i++) {
    /* 系統(tǒng)停止時(shí)將計(jì)數(shù)值寫入文件 */
 _itoa(counts[i], buf, 10);
 WritePrivateProfileString("VisitCounter",
 urls[i], buf, logfile);
 }
 return TRUE;
}

以上二個(gè)例子作者使用VC 6.0編譯,在WINNT2000 + SP3 和 IIS 5.0上調(diào)試通過。