C++ 早已是許多繁忙網站的核心技術,為中介層企業邏輯提供了高效能基礎,常用於擴充 Web 伺服器與動態產生 HTML。現今使用 Internet Information Services (IIS) 和 Visual Studio 的開發人員,可透過 Active Server Pages (ASP) 建立動態內容,並以 ISAPI 擴充 IIS。雖然 ASP 容易上手,但 ISAPI 僅被少數開發人員採用,主因在於難以直接從 Visual C++ 等開發工具進行偵錯,且支援僅限於函式庫包裝器與 ISAPI 擴充精靈。
ATL Server 是新一代 Visual C++ 中 Active Template Library (ATL) 的一組擴充功能,讓 C++ 開發人員能開發效能極高的 IIS Web 應用程式。ATL Server 提供功能強大的類別,可透過 Internet Server Application Programming Interface (ISAPI) 原生與 IIS 互動。然而,與傳統 ISAPI 不同,ATL Server 易於取得、直觀好用,在開發環境中依賴建構於 ATL 風格與精靈內的最少類別。此外,Visual C++ 已內建對 ATL Server 的廣泛支援,包含部署功能與偵錯支援。
與其他 Microsoft Windows DNA 伺服器技術不同,ATL Server 允許組織利用高效能、相對廉價的 PC 硬體建構網站基礎。ATL Server 設計可與對稱多處理 (SMP) 硬體協同運作,並允許新裝置加入現有環境。當硬體加入伺服器叢集時,以 ATL Server 建構的應用程式將自動擴展。
ATL Server 核心實作可擴充使用 ASP 等技術建構的現有解決方案。它是 ASP 的補充,可選擇性用於效能至關重要的 Web 應用程式各部分。許多情況下並不需要 ATL Server;ASP 及未來版本將提供足夠效能。僅當效能極為重要時才使用 ATL Server,這與 C++ 通用模型一致——許多公司僅在解決方案需要時才投入 C++ 開發資源,通常為達到盡可能高的效能,或撰寫其他高階語言無法存取的低階 API。
ATL Server 也是使用 Visual C++ 建構 XML Web Services 的工具。建立 ATL Server 應用程式的開發人員可在 ATL Server 應用程式精靈中選擇「發佈為 Web Service」。透過發佈 XML Web Service,開發人員可透過 Web 伺服器提供應用程式,此應用程式可透過 HTTP 以 SOAP 呼叫,將 Web 應用程式的可程式化能力延伸至需穿越防火牆的遠端用戶端。
ATL Server 解決方案僅需在伺服器端安裝檔案。典型 ATL Server 應用程式檔案包含一個 ATL Server ISAPI 動態連結庫 (DLL)、一或多個 .SRF 檔案、零或多個應用程式 DLL。

理解此架構最好的方式是以經典的「Hello World!」為例。此處顯示的應用程式是下一版 Visual C++ 用於建構 ATL Server 應用程式的起點。執行完 ATL Server 應用程式精靈後建立的部分程式碼如下所示。
每個網站使用一個 ATL Server ISAPI DLL。DLL 作為 IIS 的擴充,允許參考 .SRF 檔案的 URL 由 DLL 處理。ISAPI DLL 是 IIS 註冊用於 .SRF 檔案的預設處理常式。在這個範例中,使用者存取 https://webserver/atlserver/HelloWorld.srf 透過 ISAPI DLL 啟動 .SRF 檔案處理流程。ISAPI DLL 透過 CIsapiExtension 類別完成實作。ISAPI 擴充透過 IServiceProvider 介面提供來自 ISAPI 擴充的服務以請求處理物件。ISAPI 可能提供的服務包含工作階段服務、每執行緒資料庫連線、瀏覽器能力服務、及多種快取服務(包含範本、DLL、二進位大物件 (BLOB) 快取)。若在 ATL Server 應用程式精靈中勾選,ATL Server 將自動為開發人員建構 ISAPI DLL。開發人員可依期望的自訂程度修改產生的 ISAPI DLL 預設程式碼,但非必要。
.SRF 檔案駐留在 Web 伺服器上,定義網頁版面配置,以及由 ATL Server 應用程式 DLL 產生的動態內容如何使用。.SRF 檔案內容對大多數開發人員來說很熟悉;它們類似 HTML 檔案,但有值得注意的額外部分。
{{handler HelloWorld.dll/Default}}
<html>
<head>
<title>{{Title}}</title>
</head>
<body>
<h1>{{Title}}</h1>
{{HelloWorld}}
</body>
</html>
圖 1. HelloWorld.srf 檔案內容
此 .SRF 檔案第一行指出,由此檔案呼叫的程式碼位於 HelloWorld DLL 中,而 HelloWorld DLL 為名為「Default」的 C++ 物件提供介面。注意此處使用了兩組大括號。在 SRF 檔案中,這兩組大括號稱為取代標記。這些大括號內容包含描述指示,及/或在檔案頂部處理常式標記中命名的 C++ 物件方法名。{{Title}} 和 {{HelloWorld}} 取代標記指定了「Default」物件(將被呼叫以提供動態內容)的功能。
您可能已注意到,.SRF 檔案將 HTML 頁面版面配置與產生動態內容的程式碼區隔開來。借助 ATL Server,網頁設計師可在需要動態內容處,使用 HTML 編輯工具(如 Visual Studio .NET)以標記方式設計版面配置。這些標記與由 Visual C++ 建立的伺服器端應用程式 DLL 內程式碼對應。處理程式碼的開發人員可專注邏輯,無需關心網頁版面或靜態文字的偶爾變更。
ATL Server 解決方案大部分工作在應用程式 DLL 中實現。「取代方法對應」區段將 .SRF 檔案中雙大括號內的名稱對應到應用程式 DLL 來源檔案。
BEGIN_REPLACEMENT_METHOD_MAP(CHelloWorld)
REPLACEMENT_METHOD_ENTRY("Title", OnTitle)
REPLACEMENT_METHOD_ENTRY("HelloWorld", OnHelloWorld)
END_REPLACEMENT_METHOD_MAP()
圖 2. HelloWorld.cpp 檔案中的取代方法對應區段
OnTitle 和 OnHelloWorld 方法(與取代方法對應區段在同一檔案)實作相對簡單。它們使用 CHttpResponse 物件的串流運算子將動態內容寫入回應串流,再傳送給用戶端。
HTTP_CODE OnTitle()
{
m_HttpResponse << "HelloWorld Sample";
return HTTP_SUCCESS;
}
HTTP_CODE OnHelloWorld()
{
m_HttpResponse << "Hello World!";
return HTTP_SUCCESS;
}
圖 3. HelloWorld.cpp 檔案中 OnTitle 和 OnHelloWorld 方法實作
當然,應用程式 DLL 能做的遠超於此。ATL Server 內含的類別簡化了對 Crypto API 和 Microsoft Message Queuing (MSMQ) 的存取,允許透過 Simple Mail Transfer Protocol (SMTP) 進行簡單郵件發送。應用程式 DLL 有許多應用類別協助處理請求,包含用於請求參數的集合類別、Cookies 和 POST 資料。Multipurpose Internet Mail Extensions (MIME) 剖析器可用於剖析傳送至 Web 伺服器的 MIME 資料。請求處理常式有權存取介面,使其能存取存在於 ISAPI 擴充 EXTENSION_CONTROL_BLOCK(由 IIS 傳遞給 ISAPI 擴充、帶有請求上下文的資料結構)中的所有資訊。若所有內容必須動態產生,在不存在 .SRF 檔案情況下也可使用請求處理常式。
處理 .SRF 檔案過程中,ATL Server ISAPI DLL 從檔案開頭開始執行,調入「handler」取代標記內指定的應用程式 DLL。在應用程式 DLL 中將呼叫輸出連接埠指標,此指標接著傳遞所請求處理常式的名稱。若找到此處理常式,應用程式 DLL 將建立此處理常式一個執行個體,然後處理常式的 IRequestHandler 介面將傳回至 ISAPI 擴充。擴充接著呼叫 IRequestHandler::HandleRequest 方法,向其傳遞 HTTP 請求相關資訊。HandleRequest 方法載入範本、剖析並傳送至回應串流。作為效能改進,範本僅剖析一次。一經剖析,即由 ISAPI 擴充以剖析格式快取。後續對範本的請求將由 ISAPI 擴充的範本快取提供服務。
本例結果非常簡單:瀏覽器顯示兩行文字(圖 4)。您會注意到文字「HelloWorld Sample」的格式在 .SRF 檔案中管理:一對 HTML 標題標記被 {{Title}} 呼叫所包圍。

圖 4. HelloWorld ATL Server 應用程式的瀏覽器輸出
ATL Server 目前對開發人員撰寫 ISAPI 程式碼是理想選擇,因為它在 ISAPI 與平台 API 上提供常用程式碼的基本實作與簡單的 C++ 抽象層,簡化了 ISAPI 開發中的程式設計工作。對此類別庫的補充支援是 Visual C++ 開發環境中的精靈、部署及偵錯支援。
預見 Web 應用程式有極大效能需求的架構師與開發經理也應考慮 ATL Server。ATL Server 使用已證實的方法確保在 IIS 之上最高層級的效能。任何希望進行高效能 C++ 與 IIS 開發的 C++ 開發人員,特別是具備 ATL 經驗者,將發現 ATL Server 相當實用。