快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

使用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_MACHINESystemCurrentControlSet
ServicesW3SVCParameters下建立一个字符串项,其名称为"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:\\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上调试通过。
返回类别: 教程
上一教程: ASP利用正表达式解析HTML的类代码
下一教程: 实现让每句话的头一个字母都大写

您可以阅读与"使用ISAPI过滤器增强IIS的功能"相关的教程:
· 类似于IIS浏览的功能
· COOKIE的功能与购物车
· 用ASP实现静静话的功能
· 使用XMLHTTP为网站增加股市行情查询功能
· ASP提供在线文章翻译的功能
    微笑服务 优质保证 索取样品