---- 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过滤器就发挥作用了。 ---- 下面作者举二个具体的应用例子。 一、虚拟主机WWW站点的实现 ---- 所谓虚拟主机WWW站点,是指不同的域名占用同一个IP地址,各自拥有自己的主页。这样您可以在同一台机器上为几个甚至几十个公司建立各自的WWW站点。IIS 3.0不提供虚拟主机WWW站点的功能,但是我们可以通过ISAPI过滤器来实现它。其原理是通过URL映射信息处理,将不同的域名重新映射到不同的物理文件。 ---- 下面是它的源程序。 fmulti.def:
LIBRARY fmulti
EXPORTS GetFilterVersion
 HttpFilterProc
 TerminateFilterfmulti.c:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <httpfilt.h>#define baseroot "C:\\InetPub\\wwwroot\\"BOOL WINAPI GetFilterVersion(HTTP_FILTER_VERSION *pVer)
{
 pVer->dwFilterVersion = HTTP_FILTER_REVISION;
strcpy(pVer->lpszFilterDesc, "fmulti");
 pVer->dwFlags = SF_NOTIFY_URL_MAP |
 SF_NOTIFY_ORDER_HIGH;
 /* 过滤的内容 */
 return TRUE;
}DWORD WINAPI HttpFilterProc
(HTTP_FILTER_CONTEXT *pfc,
DWORD noteType, VOID *pvNote)
{
 DWORD namelen = 256;
 char svrname[256];
 char phyfile[280]; *svrname = 0;
 (pfc->GetServerVariable)(pfc, "SERVER_NAME",
   svrname, &namelen);
 _strlwr(svrname);
 strcpy(phyfile, ((PHTTP_FILTER_URL_MAP)pvNote)->
  pszPhysicalPath + strlen(baseroot));
 /* 以下根据域名设置需访问的物理文件 */
 if (strcmp(svrname, "ca.best.net")==0) {
 sprintf(((PHTTP_FILTER_URL_MAP)pvNote)->
pszPhysicalPath, "C:\\InetPub\\caroot\\%s",
 phyfile);
 }
 else if (strcmp(svrname, "cb.best.net")==0) {
 sprintf(((PHTTP_FILTER_URL_MAP)pvNote)->
pszPhysicalPath, "C:\\InetPub\\cbroot\\%s",
 phyfile);
 }
 return SF_STATUS_REQ_NEXT_NOTIFICATION;
}BOOL WINAPI TerminateFilter(DWORD dwFlags)
{
 return TRUE;
}二、对访问内容进行统计分析 
---- 通常我们在需要计数的页面内放一个计数器,或者使用ASP文件来实现计数功能。这种方法不能适用于如README.TXT等其他非HTML格式的文件。如果使用IIS的日志功能又太占用空间而不方便。作者通过定制URL映射信息处理来跟踪感兴趣的几个文件的计数统计,将结果记录在一个文件中。 ---- 下面是它的源程序。 fcount.def:
LIBRARY fcount
EXPORTS GetFilterVersion
 HttpFilterProc
 TerminateFilterfcount.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;

解决方案 »

  1.   

    给出delphi 实现方法。出现金收购。对ASp文件中的<%%>内容进行解码编码。
    高手可以和我邮件联系[email protected]
      

  2.   

    你直接用DELPHI的WEBSNAP得了。这样可以实现ASP的功能。
    不过开发比ASP难些。
      

  3.   

    我没有做过这方面的程序,不过我想知道工作原理,可以说一下吗? 比如<%%>里边是什么东西,你想解码成怎么样的结果,你又从哪里得到这些东西??
      

  4.   

    FILE->NEW->WEB SERVER APPLICATION就可以了
      

  5.   

    <%%>写的一些程序代码.但ISS不知道怎样编译.需要自己解析,再交给IIS处理
      

  6.   

    ISAPI FILTER并不是用来加密ASP如果你想保护ASP代码,并尽量提高速度,还不如用COM/COM+配合ASP,这种做法比较好
      

  7.   

    用COM/COM+怎样配合ASP(多提示一些)