作为一个www服务器软件,微软公司的inte.net 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 <stdio.h>
#include <string.h>
#include <windows.h>
#include <httpfilt.h>
#define logfile "c:\\.netpub\\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; /* 过滤的内容 */
for (i=0; i<pages; i++) { /* 从文件读入初始计数值 */
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] ++; /* 计数值增加 */
if (counts[i]%10==0) {
/* 当计数值满10时记入文件,
以免系统突然死掉时数据全部丢失 */
_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++) {
/* 系统停止时将计数值写入文件 */
_itoa(counts[i], buf, 10);
writeprivateprofilestring("visitcounter",
urls[i], buf, logfile);
}
return true;
}
以上二个例子作者使用vc 6.0编译,在winnt2000 + sp3 和 iis 5.0上调试通过。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器