使用ISAPI过滤器增强IIS的功能

作为一个WWW服务器软件,微软公司的Internet Infomation Server(IIS)简单易学,管理方便,得到了广泛的使用。您还可以通过ISAPI过滤器,进行自己定制的处理,来增强IIS的功能。ISAPI过滤器可以定制以下的处理:接收HTTP协议头预处理、发送HTTP协议头预处理、发送生数据预处理、获得生数据预处理、HTTP会话结束信息处理、自定义的安全认证机制、URL映射信息处理、日志记录处理等。灵活利用这些定制处理,您可以完成许多看似难以实现的功能,得到意想不到的效果。但是ISAPI过滤器使用不当也会影响服务器的性能。

ISAPI过滤器的开发非常简单,只需要完成三个接口DLL函数即可。它们是GetFilterVersion()、HttpFilterProc()、TerminateFilter(),大家可以查看MSDN了解详细的用法。ISAPI过滤器是DLL文件,一般用C/C++语言开发。为使ISAPI过滤器能够运行,您需要在注册表的HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\W3SVC\Parameters下建立一个字符串项,其名称为"Filter Dlls",值为ISAPI过滤器文件的全路径名称。若这个字符串项已经存在,只需把它的全路径名称加入其中,不同的ISAPI过滤器文件之间用";"分隔,您可以根据执行的优先顺序加在适当的位置。设置好后重新启动IIS服务,您的ISAPI过滤器就发挥作用了。

下面作者举一个具体的应用例子。

对访问内容进行统计分析:
通常我们在需要计数的页面内放一个计数器,或者使用ASP文件来实现计数功能。这种方法不能适用于如README.TXT等其他非HTML格式的文件。如果使用IIS的日志功能又太占用空间而不方便。作者通过定制URL映射信息处理来跟踪感兴趣的几个文件的计数统计,将结果记录在一个文件中。

下面是它的源程序。

fcount.def:
LIBRARY fcount
EXPORTS GetFilterVersion
HttpFilterProc
TerminateFilter

fcount.c:
#include

 1<stdio.h>   
 2#include <string.h>   
 3#include <windows.h>   
 4#include <httpfilt.h>
 5
 6#define logfile "C:\\\InetPub\\\fcount.log"   
 7#define pages 5   
 8char* urls[] = {   
 9"/default.htm",   
10"/banner.gif",   
11"/product/readme.txt",   
12"/product/product1.htm",   
13"/product/product2.htm"   
14};   
15int counts[pages]; 
16
17BOOL WINAPI GetFilterVersion   
18(HTTP_FILTER_VERSION *pVer)   
19{   
20int i; 
21
22pVer-&gt;dwFilterVersion = HTTP_FILTER_REVISION;   
23strcpy(pVer-&gt;lpszFilterDesc, "fcount");   
24pVer-&gt;dwFlags = SF_NOTIFY_URL_MAP; /* 过滤的内容 */ 
25
26for (i=0; i<pages; ((phttp_filter_url_map)pvnote)="" (http_filter_context="" *="" *pfc,="" *pvnote)="" -="" 0,="" buf[16];="" char="" counts[i]='GetPrivateProfileInt("VisitCounter",' dword="" httpfilterproc="" i++)="" i;="" int="" logfile);="" lurl[512];="" notetype,="" return="" strcpy(lurl,="" true;="" urls[i],="" void="" winapi="" {="" }="" 从文件读入初始计数值="">pszURL);   
27_strlwr(lurl);   
28for (i=0; i&lt;pages; i++) {   
29if (strcmp(lurl, urls[i])==0) {   
30counts[i] ++; /* 计数值增加 */   
31if (counts[i]%10==0) {   
32/* 当计数值满10时记入文件,   
33以免系统突然死掉时数据全部丢失 */   
34_itoa(counts[i], buf, 10);   
35WritePrivateProfileString("VisitCounter",   
36urls[i], buf, logfile);   
37}   
38break;   
39}   
40}   
41return SF_STATUS_REQ_NEXT_NOTIFICATION;   
42} 
43
44BOOL WINAPI TerminateFilter(DWORD dwFlags)   
45{   
46int i;   
47char buf[16]; 
48
49for (i=0; i&lt;pages; i++) {   
50/* 系统停止时将计数值写入文件 */   
51_itoa(counts[i], buf, 10);   
52WritePrivateProfileString("VisitCounter",   
53urls[i], buf, logfile);   
54}   
55return TRUE;   
56} 
57
58以上二个例子作者使用VC 6.0编译,在WINNT2000 + SP3 和 IIS 5.0上调试通过。</pages;></httpfilt.h></windows.h></string.h></stdio.h>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus