选择显示字体大小

使用isapi过滤器增强iis的功能

作为一个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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons