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

分类: asp   出处:iocblog整理  更新时间:2009-01-01   添加到收藏  

作为一个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_machinesystemcurrentcontrolset
servicesw3svcparameters下建立一个字符串项,其名称为"filter dlls",值为isapi过滤器文件的全路径名称。若这个字符串项已经存在,只需把它的全路径名称加入其中,不同的isapi过滤器文件之间用";"分隔,您可以根据执行的优先顺序加在适当的位置。设置好后重新启动iis服务,您的isapi过滤器就发挥作用了。

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

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

下面是它的源程序。

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; /* 过滤的内容 */

 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上调试通过。[www.iocblog.net 来源]
 


Tag: ISAPI ,过滤器



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。