使用ISAPI过滤器增强IIS的功能
作为一个www服务器软件,微软公司的internet infomation server(iis)简单易学,管理方便,得到了广泛的使用。您还可以通过isapi过滤器,进行自己定制的处理,来增强iis的功能。isapi过滤器可以定制以下的处理:接收http协议头预处理、发送http协议头预处理、发送生数据预处理、获得生数据预处理、http会话结束信息处理、自定义的安全认证机制、url映射信息处理、日志记录处理等。灵活利用这些定制处理,您可以完成许多看似难以实现的功能,得到意想不到的效果。但是isapi过滤器使用不当也会影响服务器的性能。 下面作者举一个具体的应用例子。 对访问内容进行统计分析: 下面是它的源程序。 fcount.def: fcount.c: #define logfile "c:\inetpub\fcount.log" bool winapi getfilterversion pver->dwfilterversion = http_filter_revision; for (i=0; i<pages; i++) { /* 从文件读入初始计数值 */ return true; dword winapi httpfilterproc strcpy(lurl, ((phttp_filter_url_map)pvnote) bool winapi terminatefilter(dword dwflags) for (i=0; i<pages; i++) { 以上二个例子作者使用vc 6.0编译,在winnt2000 + sp3 和 iis 5.0上调试通过。[www.iocblog.net 来源]
isapi过滤器的开发非常简单,只需要完成三个接口dll函数即可。它们是getfilterversion()、httpfilterproc()、terminatefilter(),大家可以查看msdn了解详细的用法。isapi过滤器是dll文件,一般用c/c++语言开发。为使isapi过滤器能够运行,您需要在注册表的hkey_local_machinesystemcurrentcontrolset
servicesw3svcparameters下建立一个字符串项,其名称为"filter dlls",值为isapi过滤器文件的全路径名称。若这个字符串项已经存在,只需把它的全路径名称加入其中,不同的isapi过滤器文件之间用";"分隔,您可以根据执行的优先顺序加在适当的位置。设置好后重新启动iis服务,您的isapi过滤器就发挥作用了。
通常我们在需要计数的页面内放一个计数器,或者使用asp文件来实现计数功能。这种方法不能适用于如readme.txt等其他非html格式的文件。如果使用iis的日志功能又太占用空间而不方便。作者通过定制url映射信息处理来跟踪感兴趣的几个文件的计数统计,将结果记录在一个文件中。[www.iocblog.net 来源]
library fcount
exports getfilterversion
httpfilterproc
terminatefilter
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <httpfilt.h>
#define pages 5
char* urls[] = {
"/default.htm",
"/banner.gif",
"/product/readme.txt",
"/product/product1.htm",
"/product/product2.htm"
};
int counts[pages];
(http_filter_version *pver)
{
int i;
strcpy(pver->lpszfilterdesc, "fcount");
pver->dwflags = sf_notify_url_map; /* 过滤的内容 */
counts[i] = getprivateprofileint("visitcounter",
urls[i],
0, logfile);
}
}
(http_filter_context *pfc,
dword notetype, void *pvnote)
{
int i;
char lurl[512];
char buf[16];
->pszurl);
_strlwr(lurl);
for (i=0; i<pages; i++) {
if (strcmp(lurl, urls[i])==0) {
counts[i] ++; /* 计数值增加 */
if (counts[i]%10==0) {
/* 当计数值满10时记入文件,
以免系统突然死掉时数据全部丢失 */
_itoa(counts[i], buf, 10);
writeprivateprofilestring("visitcounter",
urls[i], buf, logfile);
}
break;
}
}
return sf_status_req_next_notification;
}
{
int i;
char buf[16];
/* 系统停止时将计数值写入文件 */
_itoa(counts[i], buf, 10);
writeprivateprofilestring("visitcounter",
urls[i], buf, logfile);
}
return true;
}
Tag: ISAPI ,过滤器
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。