请 求 后 不 会 马 上 消 失, 而 是 继 续 驻 留 在 内 存 中 等 待 处 理 别 的 用 户 输 入, 直 到 过 了 一 段 时 间 后 一 直 没 有 用 户 输 入。
4.5 ISAPI 性 能 评 价
一 个ISAPI 的DLL, 可 以 在 被 用 户 请 求 激 活 后 长 驻 内 存, 等 待 用 户 的 另 一 个 请 求, 还 可 以 在 一 个DLL 里 设 置 多 个 用 户 请 求 处 理 函 数, 此 外,ISAPI 的DLL 应 用 程 序 和WWW 服 务 器 处 于 同 一 个 进 程 中, 效 率 要 显 著 高 于CGI。
不 过ISAPI 的 平 台 兼 容 性 较 差, 目 前 只 能 用 于 微 软 自 己 的Windows 95 和NT 操 作 系 统 上, 服 务 器 平 台 也 仅 限 于IIS(Internet Information Server) 和MS personal web server 以 及NT workstation 上 的peer web server。
五、ISAPI 的 实 现
能 够 支 持ISAPI 开 发 的 平 台 只 有 微 软 的 几 个 平 台 组 合( 如NT+IIS,WIN95+MS personal web server)。 因 此 开 发ISAPI 只 能 这 几 个 平 台 上。 开 发 语 言 前 已 有 述, 这 里 向 大 家 推 荐Visual C++ 4.2 版, 它 的Wizard 提 供 了 专 门 制 作ISAPI 的 功 能 项。
下 面 是 个 简 单 的 例 子, 功 能 是 将 用 户 从 浏 览 器 上 的 输 入 简 单 地 回 显 给 用 户, 功 能 简 单, 但 是 具 备 一 个 典 型 的ISAPI 全 部 流 程。 源 程 序 如 下( 大 部 分 为Wizard 生 成 的 代 码):
1. 主 程 序:
// ISAPI1.CPP - Implementation file for your Internet Server
#include "stdafx.h"
#include "isapi1.h"
///////////////////////////////////////////////////////////////////////
// The one and only CWinApp object
// NOTE: You may remove this object if you alter your project to no
// longer use MFC in a DLL.
CWinApp theApp;
///////////////////////////////////////////////////////////////////////
// command-parsing map
BEGIN_PARSE_MAP(CIsapi1Extension, CHttpServer)
/************* My codes begin here ***********/
ON_PARSE_COMMAND(RegisterUser,
CIsapi1Extension, ITS_PSTR ITS_PSTR ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("First Middle Last")
/************* My codes end here ***********/
END_PARSE_MAP(CIsapi1Extension)
///////////////////////////////////////////////////////////////////////
// The one and only CIsapi1Extension object
CIsapi1Extension theExtension;
///////////////////////////////////////////////////////////////////////
// CIsapi1Extension implementation
CIsapi1Extension::CIsapi1Extension()
{
}
CIsapi1Extension::~CIsapi1Extension()
{
}
BOOL CIsapi1Extension::GetExtensionVersion
(HSE_VERSION_INFO* pVer)
{
// Call default implementation for initialization
CHttpServer::GetExtensionVersion(pVer);
// Load description string
TCHAR sz[HSE_MAX_EXT_DLL_NAME_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_SERVER, sz, HSE_MAX_EXT_DLL_NAME_LEN));
_tcscpy(pVer->lpszExtensionDesc, sz);
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// CIsapi1Ex