ISAPI 與CGI 的 比 較 及 其 實 現 (轉)

bp發表於2007-08-13
ISAPI 與CGI 的 比 較 及 其 實 現 (轉)[@more@] 

IS 與的 比 較 及 其 實 現

龔 建 勇


( 華 中 理 工 大 學 圖 像 識 別 與 人 工 智 能 所)
( 通 信 地 址: 華 中 理 工 大 學 西 五 舍203 室,PC:430074)  
摘 要: 本 文 介 紹 了 實 現 交 互 的 兩 種 方 法,CGI 及ISAPI。 對 它 們 的 原 理、 實 現 方 法 作 了 闡 述, 並 就 它 們 的 性 能 進 行 了 比 較。 最 後 簡 單 介 紹 了ISAPI 應 用 的 具 體 實 現。

  關 鍵 詞: WEB 交 互 CGI ISAPI

一、 引 言

  ISAPI 與CGI 都 屬 於 通 用 的 網 關 接 口, 主 要 用 來 實 現WWW 服 務 器 與 客 戶 端 的 信 息 交 互。

  隨 著WWW 爆 炸 式 的 發 展 及 其 日 益 普 及, 人 們 的 眼 光 已 被 充 斥 其 上 的 商 機 所 吸 引。 在WWW 上 求 取 經 濟 利 益 的 方 式 主 要 有 以 下 幾 種:

  1. 通 過 為 企 業 等 作 廣 告 宣 傳 收 取 廣 告 費;
  2. 向 入 網 觀 看 者 收 取 訂 閱 費;
  3. 直 接 在 網 上 出 售 商 品 和 服 務。

  目 前 大 多 數 網 站 提 供 信 息 的 方 式 是 由 用 戶 通 過 客 戶 瀏 覽 器(scape 或Explorer 等) 與WWW 服 務 器 連 接, 然 後 用 鼠 標 點 按 超 連 接 以 瀏 覽 相 關 主 頁。 在 此 過 程 中, 基 本 上 是 服 務 器 向 客 戶 端 單 方 向 的 信 息 傳 遞, 隨 著 服 務 需 求 的 不 斷 擴 大, 這 種 單 純 的 單 方 向 傳 遞 信 息 的 靜 態 主 頁 已 不 能 滿 足 需 求。 不 論 是 服 務 提 供 方 還 是 客 戶, 都 希 望 瀏 覽 服 務 器 將 信 息 發 送 到 用 戶 同 時, 用 戶 端 也 能 將 信 息 發 送 到 服 務 器 端, 實 現 服 務 器 與 客 戶 的 交 互。 典 型 的 應 用 如: 用 戶 登 記 表、 用 戶 留 言 板 以 及 用 戶 通 過WWW 檢 索 服 務 器 端 的 數 據 庫 等。

  要 實 現 一 個 可 與 用 戶 交 互 信 息 的 服 務 系 統, 所 需 增 加 的 有 兩 項: 交 互 式 主 頁 和 用 戶 輸 入 信 息 處 理 程 序。 交 互 式 主 頁 即 有 輸 入 信 息 的 編 輯 框, 選 擇 菜 單 按 鈕 之 類 的 主 頁, 以 供 用 戶 輸 入 信 息; 用 戶 輸 入 的 信 息 則 交 由 用 戶 信 息 處 理 程 序 處 理。 實 現 該 程 序 可 以 有 多 種 途 徑, 該 程 序 可 以 放 在 服 務 器 端, 也 可 以 放 在 客 戶 機 端, 前 者 如CGI、ISAPI, 後 者 如 APPLET 等。 本 文 只 討 論 前 者, 將 闡 述ISAPI 的 優 點, 並 就 其 實 現 舉 例 說 明。

二、WEB 交 互 環 境 的 實 現

  2.1 交 互 式 主 頁

  要 實 現WEB 上 的 交 互 環 境, 用 戶 必 須 能 夠 在 他 瀏 覽 到 的 主 頁 上 輸 入 信 息, 這 就 是 一 個 交 互 式 的 主 頁。 一 般 來 說, 用 戶 輸 入 信 息 的 形 式 有 填 寫 編 輯 框, 點 選 無 線 按 鈕 等 選 擇 框 及 選 擇 下 拉 菜 單 等, 所 以 交 互 主 頁 也 必 須 有 這 些 輸 入 元 素 項。 下 面 是 一 個 簡 單 的 交 互 主 頁 例 子:

交 互 式 主 頁HTML 源 文 件:isapi1.htm 「HTML」「TITLE」 TEST 「/TITLE」「HEAD」 ISAPI TEST 「/HEAD」「BODY」「foaction="/gjy/isapi1/de/isapi1.dll?RegisterUser" method=post」 Input your Register Infomation:「br」 Name :「input type="text" name="First"」「br」 Address:「input type="text" name="Middle"」「br」 E:「input type="text" name="Last"」「br」「p」「input type="submit"」 「input type="reset" 」「/p」「/form」「/body」「/html」


  通 過Explorer 瀏 覽 器 打 開 該 文 件, 可 以 看 到 如 下 效 果( 編 輯 框 中 已 輸 入 內 容):

  2.2 實 現 交 互 主 頁 的 途 徑。

  從 上 述 主 頁 制 作 描 述 可 見, 一 個 交 互 式 主 頁 的 制 作 是 很 簡 單 的, 但 要 真 正 實 現 與 用 戶 的 交 互, 還 必 須 要 有 應 用 程 序 的 參 與。 這 個 程 序 可 以 屬 於 多 種 樣 式, 如CGI、JAVA APPLET 以 及ISAPI。 在 上 述 主 頁 文 件 中, 有 一 項:

「form action="/gjy/isapi1/debug/isapi1.dll?RegisterUser" method=post」


  這 裡 就 指 明 了 對 應 處 理 該 主 頁 輸 入 信 息 的 程 序(isapi1.dll), 這 是ISAPI 的 應 用 程 序 動 態 連 接 庫。 對 於CGI 應 用 程 序 也 是 一 樣 的 處 理。

  一 般 來 說, 該 程 序 的 功 能 就 是 要 將 用 戶 輸 入 信 息 傳 到 服 務 器 應 用 程 序。

  CGI 是 大 家 都 比 較 熟 悉 的 一 種 實 現 上 述 功 能 的 有 效 途 徑, 也 可 能 是 當 前 最 為 流 行 的 一 種, 而ISAPI 是 微 軟 獨 特 的 具 有 類 似CGI 功 能 的 網 絡 應 用 接 口 標 準。ISAPI 在 性 能 上 較 之CGI 具 有 許 多 優 良 特 性。 下 面 我 們 簡 單 介 紹 一 下CGI 與ISAPI 以 及 它 們 之 間 的 性 能 差 別。

三、CGI 原 理 及 其 性 能

  3.1 CGI 概 念

  CGI 即 通 用 網 關 接 口(Common Gateway Interface), 它 是 一 個WWW 服 務 器

  主 機 對 外 服 務 的 標 準 接 口, 一 般 來 說, 一 個CGI 接 口 的 功 能 就 是 在 超 文 本 文 件 和 服 務 器 主 機 應 用 程 序 間 傳 遞 信 息。

  3.2 CGI 程 序 語 言

  事 實 上, 任 何 一 種 程 序 語 言, 只 要 能 在 服 務 器 主 機 上 利 用CGI 接 口 來 編 寫 應 用 程 序, 都 可 以 叫 作CGI 程 序 語 言。 目 前 最 為 流 行 的CGI 程 序 語 言 有 四 種:C,, 和, 其 它 一 些 語 言 也 有 許 多 人 在 用, 如TCL,Fortran 及AppleScript 等。

  3.3 CGI 程 序 的 執 行

  CGI 程 序 一 般 是 個 可 執 行 程 序。 編 譯 好 的CGI 程 序 一 般 要 集 中 放 在 一 個 目 錄 下。 具 體 存 放 的 位 置 隨 操 作 系 統 的 不 同 而 不 同, 例 如 系 統 下 是 放 在cgi-bin 子 目 錄 下, 而 在 操 作 系 統 下( 注 意, 這 裡 不 包 括NT4.0) 以Webs或Website 作WWW 服 務 器,CGI 程 序 都 放 在cgi-win 下。CGI 程 序 的 執 行 一 般 有 兩 種 調 用 方 式:1 是 通 過URL 直 接 調 用, 如:“”, 在 瀏 覽 器 的URL 欄 裡 直 接 寫 入 上 述 描 述 就 可 以 調 用 該 程 序; 另 一 種 方 式, 也 是 主 要 的 方 式, 是 通 過 交 互 式 主 頁 裡 的FORM 欄 調 用, 通 常 都 是 用 戶 在 填 完 一 張 輸 入 信 息 主 頁 後 按 確 認 按 鈕 啟 動CGI 程 序, 前 面 的 交 互 主 頁 就 是 一 個 如 此 調 用CGI 的 典 型 例 子。

  3.4 CGI 工 作 的 主 要 流 程

  CGI 工 作 的 主 要 流 程 是:1. 一 個 用 戶 請 求 激 活 一 個CGI 應 用 程 序;2.CGI 應 用 程 序 將 交 互 主 頁 裡 用 戶 輸 入 信 息 提 取 出 來;3. 將 用 戶 輸 入 的 信 息 傳 給 服 務 器 主 機 應 用 程 序( 如 數 據 庫 查 詢〕;4. 將 服 務 器 處 理 結 果 通 過HTML 文 件 返 回 給 用 戶;5.CGI 進 程 結 束。

  3.5 CGI 的 性 能 評 價

  CGI 的 跨 平 臺 性 能 極 佳, 幾 乎 可 以 在 任 何 操 作 系 統 上 實 現, 如DOS、WINDOWS、UNIX、OS/2、Macintosh 等。 實 現CGI 的 編 程 語 言 也 有 很 多 選 擇。CGI 的 應 用 程 序 一 般 都 是 一 個 獨 立 的 可 執 行 程 序, 和WWW 服 務 器 各 自 佔 據 著 不 同 的 進 程, 而 且 一 般 一 個CGI 程 序 只 能 處 理 一 個 用 戶 請 求。 這 樣, 每 有 一 個 用 戶 請 求, 都 會 激 活 一 個CGI 進 程, 當 用 戶 請 求 數 量 非 常 多 時, 會 大 量 擠 佔 系 統 的 資 源 如 內 存, 時 間 等, 造 成 效 能 低 下。

四、ISAPI 原 理 及 其 性 能

  4.1 ISAPI 概 念

  ISAPI 即Internet Server Application Program Interface, 是 微 軟 提 供 的 一 套 面 向Internet 服 務 的API 接 口, 它 能 實 現CGI 能 提 供 的 全 部 功 能, 並 在 此 基 礎 上 進 行 了 擴 展, 如 提 供 了 過 濾 器 應 用 程 序 接 口。

  4.2 ISAPI 程 序 語 言

  由 於 開 發ISAPI 應 用 要 用 到 微 軟 的 一 套API, 所 以 能 用 來 開 發ISAPI 應 用 的 語 言 不 如CGI 那 麼 多。 主 要 有Visual C++ 4.1 以 上 版 本,Visual Basic 5.0、Borland C++ 5.0 也 可 以。

  4.3 ISAPI 原 理

  ISAPI 的 工 作 原 理 和CGI 大 體 上 是 相 同 的, 都 是 通 過 交 互 式 主 頁 取 得 用 戶 輸 入 信 息, 然 後 交 服 務 器 後 臺 處 理。 但 是 二 者 在 實 現 機 制 上 大 相 庭 徑。ISAPI 與CGI 最 大 的 區 別 在 於: 不 同 於CGI, 在ISAPI 下 建 立 的 應 用 程 序 是 以 動 態 連 接 庫 的 形 式 存 在; 而CGI 的 應 用 程 序 一 般 都 是 可 執 行 程 序。

  4.4 ISAPI 程 序 的 執 行

  ISAPI 應 用 的 工 作 流 程 與CGI 有 一 些 不 同。ISAPI 應 用 的DLL 不 僅 可 以 象CGI 程 序 一 樣 被 用 戶 請 求 激 活, 還 可 以 被 系 統 預 先 激 活 來 監 視 用 戶 輸 入; 對 於 被 用 戶 激 活 的DLL, 在 處 理 完 一 個 用 戶 請 求 後 不 會 馬 上 消 失, 而 是 繼 續 駐 留 在 內 存 中 等 待 處 理 別 的 用 戶 輸 入, 直 到 過 了 一 段 時 間 後 一 直 沒 有 用 戶 輸 入。

  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 // 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(AfxGetReHandle(), IDS_SERVER, sz, HSE_MAX_EXT_DLL_NAME_LEN)); _tcscpy(pVer->lpszExtensionDesc, sz); return TRUE; } /////////////////////////////////////////////////////////////////////// // CIsapi1Extension command handlers /****** My code begins here**********/ void CIsapi1Extension::RegisterUser ( CHttpServerContext* pctxt, LPCTSTR pstrFirst, LPCTSTR pstddle, LPCTSTR pstrLast ) { // do processing here! *pctxt << _T("Your name is:"); *pctxt << _T(pstrFirst); *pctxt << _T(" "); *pctxt << _T("Your Address is:"); *pctxt << _T(pstrMiddle); *pctxt << _T(" "); *pctxt << _T("Your E_mail is:"); *pctxt << _T(pstrLast); } /********* My codes end here **********/ // Do not edit the following lines, which are needed by ClassWizard. #if 0 BEGIN_MESSAGE_MAP(CIsapi1Extension, CHttpServer) //{{AFX_MSG_MAP(CIsapi1Extension) //}}AFX_MSG_MAP END_MESSAGE_MAP() #endif// 0 2. 主 頭 文 件 // ISAPI1.H - Header file for your Internet Server //isapi1 Extension #include "resource.h" class CIsapi1Extension : public CHttpServer { public: CIsapi1Extension(); ~CIsapi1Extension(); // Overrs // ClassWizard generated virtual function overrides // NOTE - the ClassWizard will add and remove member functions here. //DO NOT EDIT what you see in these blocks of generated code ! //{{AFX_VIRTUAL(CIsapi1Extension) public: virtual BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer); //}}AFX_VIRTUAL // TODO: Add handlers for your commands here. /*********** My coded begin here ( 函 數 聲 明) *********/ void RegisterUser( CHttpServerContext* pctxt, LPCTSTR pstrFirst, LPCTSTR pstrMiddle, LPCTSTR pstrLast ); /*********My codes end here DECLARE_PARSE_MAP() //{{AFX_MSG(CIsapi1Extension) //}}AFX_MSG }; 3. 動 態 連 接 庫 定 義 文 件 /*************************************/ /*ISAPI1.def */ /*************************************/ ; ISAPI1.def : declares the module parameters for the DLL. LIBRARY"ISAPI1" EXPORTS HttpExtensionProc GetExtensionVersion


  在 上 述 程 序 中, 定 義 了 一 個CHttpServer 的 類CIsapi1Extension, 這 是 該 程 序 的 主 要 一 個 類, 通 過 它 實 現 與 用 戶 交 互 的 功 能。 由ON_PARSE_COMMAND 段 實 現 函 數 映 射, 上 述 程 序 中 定 義 了 該DLL 中 的 一 個 成 員 函 數RegisterUser, 其 功 能 就 是 將 用 戶 在 編 輯 框 中 輸 入 的 信 息 發 送 回 用 戶。 關 於 具 體 實 現 細 節, 可 以 參 看VC4.2 幫 助 文 檔。

  將 上 述 文 件 編 譯 成DLL 後 放 入 服 務 器 主 機 內WWW 服 務 器 指 定 的 用 戶 有 執 行 權 限 的Scripts 目 錄 裡, 該 目 錄 的 邏 輯 名 應 和 交 互 主 頁 裡 的 一 致。 設 置 完 後, 通 過 瀏 覽 器 連 到 服 務 器 上, 瀏 覽 該 主 頁, 並 輸 入 信 息 到 編 輯 框 中。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10790663/viewspace-954390/,如需轉載,請註明出處,否則將追究法律責任。

相關文章