ISAPI过滤器可以定制以下的处理:接收HTTP协议头预处理、发送HTTP协议头预处理、发送生数据预处理、获得生数据预处理、HTTP会话结束信息处理、自定义的安全认证机制、URL映射信息处理、日志记录处理等。灵活利用这些定制处理,您可以完成许多看似难以实现的功能,得到意想不到的效果。但是ISAPI过滤器使用不当也会影响服务器的性能。 
---- ISAPI过滤器的开发非常简单,只需要完成三个接口DLL函数即可。它们是GetFilterVersion()、HttpFilterProc()、TerminateFilter(),大家可以查看MSDN了解详细的用法。ISAPI过滤器是DLL文件。为使ISAPI过滤器能够运行,您需要在注册表的HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\W3SVC\Parameters下建立一个字符串项,其名称为"Filter Dlls",值为ISAPI过滤器文件的全路径名称。若这个字符串项已经存在,只需把它的全路径名称加入其中,不同的ISAPI过滤器文件之间用";"分隔,您可以根据执行的优先顺序加在适当的位置。设置好后重新启动IIS服务,您的ISAPI过滤器就发挥作用了。 
IIS 预 定 义 的 事 件 如 下:  SF_NOTIFY_READ_RAW_DATA ---- 当IIS 要 从 用 户 读 入 数 据 时 发 生。 过 滤 器 可 以 在IIS 处 理 他 们 之 前 检 查 甚 至 修 改 用 户 输 入 的 原 始 数 据。 ---- SF_NOTIFY_PREPROC_HEADERS ---- IIS 预 处 理HTTP 请 求 包 头 后 发 生。 过 滤 器 可 以 检 查 修 改 增 加 包 头。 ---- SF_NOTIFY_AUTHENTICATION ---- IIS 试 图 验 证 用 户 身 份 时 发 生。 过 滤 器 可 以 实 现 自 己 的 验 证 方 案。 ---- SF_NOTIFY_URL_MAP ---- IIS 试 图 将URL 解 释 为 物 理 文 件 时。 过 滤 器 可 以 将 请 求 重 定 向 到 其 他 的 文 件。 ---- SF_NOTIFY_ACCESS_DENIED 
---- 当 身 份 验 证 失 败 时 发 生。 
---- SF_NOTIFY_SEND_RAW_DATA ---- 当 其 他 程 序 处 理 完,IIS 准 备 将 数 据 发 回 给 用 户 时 发 生。 我 们 的 过 滤 器 就 通 过 此 事 件, 转 换 内 码。 ---- SF_NOTIFY_LOG ---- 当IIS 写 记 录 到LOG 文 件 时。 过 滤 器 可 以 搜 集 更 多 的 信 息 写 入 记 录 文 件 中。 ---- SF_NOTIFY_END_OF_REQUEST ---- 当 一 个HTTP 请 求 结 束 时 发 生。 过 滤 器 可 以 实 现 基 于 请 求 的 处 理。 由 于 这 是 在IIS 3.0 中 新 增 的,Delphi 中 的ISAPI2.pass 单 元 中 没 有 相 应 的 定 义 可 以 手 工 加 入SF_NOTIFY_END_OF_REQUEST=$80 ---- SF_NOTIFY_END_OF_NET_SESSION ---- 连 接 结 束 时。 注 意 如 果 浏 览 器 支 持"keep-alive", 一 次 连 接 可 能 包 含 几 个HTTP 请 求。 过 滤 器 可 以 用 他 来 释 放 一 些 用 户 的 资 源。 
具 体 程 序 有 两 个 问 题 需 要 注 意: 过 滤 器 只 能 处 理 返 回 是HTML 格 式 的, 其 他 图 片 等 二 进 制 请 求 无 须 也 不 允 许 转 换。 对 于 返 回 的HTML, 只 处 理 实 际 数 据, 其 他HTTP 协 议 的 包 不 应 该 处 理。  ---- 每 个ISAPI 过 滤 器DLL 必 须 输 出 两 个 供IIS 使 用 的 函 数: ---- GetFilterVersion() 和HttpFilterProc()。 下 面 分 别 讲 述。 ---- GetFilterVersion() ---- 用 于 初 始 化 和 处 理 事 件 的 登 记。 例 程 没 有 初 始 工 作 要 做, 只 是 简 单 的 登 记 了 要 处 理 的 两 个 事 件 和 其 他 一 些 标 志。 function GetFilterVersion(var pVer:
        THTTP_FILTER_VERSION): BOOL; stdcall;
begin
//过滤器要处理的事件和其他一些标志
 pVer.dwFlags := (
SF_NOTIFY_NONSECURE_PORT 
              //过滤器只在一般端口上使用
or SF_NOTIFY_SEND_RAW_DATA 
                  //处理发送数据事件
or $80 // SF_NOTIFY_END_OF_REQUEST
                   处理请求结束事件
or SF_NOTIFY_ORDER_DEFAULT
           //过滤器使用缺省优先级
);
//过滤器使用的版本HTTP_FILTER_REVISION
             返回当前版本
  pVer.dwFilterVersion := HTTP_FILTER_REVISION;
//过滤器的描述
  pVer.lpszFilterDesc[0]:='A';  pVer.lpszFilterDesc[1]:=#0;
  result:=true; //初始化成功
end;HttpFilterProc()---- 由IIS 回 调, 是 过 滤 器 的 实 际 处 理 部 分。 
---- 其 中 参 数Notificationtype 是 该 调 用 的 事 件 类 型, 如 果 过 滤 器 处 理 多 个 事 件, 可 以 检 查 该 值 来 区 分 事 件。 
---- PvNotification 是 一 个 根 据 事 件 类 型 可 变 结 构 的 参 数。 对 于SF_NOTIFY_SEND_RAW_DATA, 他 的 结 构 如 下: THTTP_FILTER_RAW_DATA = record
pvInData: Pointer;    //指向数据区
cbInData: DWORD;   //数据大小
cbInBuffer: DWORD;   //缓冲的大小
dwReserved: DWORD;  //保留
end;---- 其 中 的pvInData 就 是 要 发 送 的 数 据 指 针。 其 他 的 结 构 请 参 看 有 关 资 料 这 里 不 再 详 述。 ---- 第 一 个 参 数var pfc: THTTP_FILTER_CONTEXT 是 过 滤 器 的 环 境 指 针, 其 中 的pFilterContext 是 一 个 用 户 使 用 的 指 针, 用 来 保 存 和 一 个HTTP 连 接 相 关 的 信 息, 这 样 过 滤 器 可 以 区 分 出 正 在 处 理 的 是 否 是 以 前 曾 处 理 过 的 连 接。 因 为 一 个 请 求 将 会 产 生 多 个SF_NOTIFY_SEND_RAW_DATA 事 件, 过 滤 器 必 须 能 够 区 分 他 们。 ---- 程 序 的 流 程 是: 当 连 接 建 立 后,pFilterContext 被IIS 初 始 化 为NIL(0), 第 一 次SF_NOTIFY_SEND_RAW_DATA 调 用 时, 过 滤 器 要 检 查 返 回 的MIME, 如 果 不 是HTML 则 将pFilterContext 置 为pointer(2)( 将 指 针 当 作 变 量 用, 因 为 我 们 只 要 一 个 标 志), 随 后 的 发 送 事 件 调 用 将 直 接 返 回。 请 求 结 束 后, 发 生SF_NOTIFY_END_OF_REQUEST 事 件, 过 滤 程 序 将pFilterContext 复 位 为nil。 ---- 如 果 是HTML, 则 将pFilterContext 置 为pointer(1), 随 后 的 调 用 就 将 对 数 据 进 行 内 码 的 转 换, 然 后 将pFilterContext 置 为pointer(3)。 如 果 还 有 后 续 的 调 用, 则 再 将pFilterContext 置 为pointer(1), 直 到 全 部 数 据 发 送 完 成。 function HttpFilterProc(var pfc: THTTP_FILTER_CONTEXT; 
Notificationtype: DWORD;  pvNotification: Pointer): DWORD; stdcall;
var
p:PHTTP_FILTER_RAW_DATA;
i:integer;
pc:pchar;
begin
if Notificationtype=$80 then
//是SF_NOTIFY_END_OF_REQUEST将pFilterContext复位
  begin
  pfc.pFilterContext:=nil;
  end
else
begin
   p:=PHTTP_FILTER_RAW_DATA(pvNotification);
   pc:=p^.pvInData;
case integer(pfc.pFilterContext) of
0: //第一次调用,要检查MIME
  begin
   pfc.pFilterContext:=pointer(2);
   i:=0;
   while i
----library p1;
uses
 SysUtils,math, Classes, windows,
 isapi2, //delphi中ISAPI过滤器单元
 //下面两个函数的定义见上文
function HttpFilterProc(...); begin ... end;
function GetFilterVersion(...); begin ... end;
exports
    HttpFilterProc index 1, GetFilterVersion index 2;
Begin end.