模組化的 IIS 7 與 .NET 能力整合
作者: 賴榮樞
http://www.goodman-lai.idv.tw
IIS(Internet Information Services)不僅是 Windows Server 的重要功能,Windows 用戶端作業系統也有這項功能,而 Windows Vista 以及專案代號為 "Longhorn" 的 Windows Server,也都會內建最新版本的 IIS,也就是 IIS 7。微軟日前釋出的 Windows Vista RC 1,就內建了 IIS 7;雖然 Windows Vista 的目的並非作為商用的 Web 執行平台,但若您有機會取得 Windows Vista RC1,除了測試 Windows Vista 的最新功能之外,不妨也利用機會預先體驗最新版本的 IIS。
這篇文章除了將以最近釋出的 Windows Vista RC1 呈現 IIS 7 的模組化功能,也將簡述 IIS 各個版本;這篇文章的議題包含了:
IIS 簡史
Windows Vista 版本與 IIS 7 功能
模組化的 IIS 7
充分整合 .NET 能力的 IIS 7
結語
IIS 1.0 和 IIS 2.0 是隨著 Windows NT 3.51 Service Pack 3 和 Windows NT 4.0 釋出,這時候網站應用程式的開發方式是 CGI(Common Gateway Interface)和 ISAPI(Internet Server Application Programming Interface);大幅簡化網站應用程式開發的 ASP(Active Server Pages)1.0 是由 IIS 3.0 開始提供(1996 年 12 月),而 IIS 3.0 則是內建在 Windows NT 4.0 Service Pack 3。
兩年左右的時間,IIS 已經藉由 Windows NT 4.0 Option Pack 推出了 4.0(1997 年九月),而 IIS 4.0 提供的是 ASP 2.0 的技術(並且也不再提供 Gopher 協定的功能)。IIS 5.0 與上個版本的間隔時間較長,是隨著 Windows 2000 推出(2000 年 11 月),而 Windows XP Professional 則內建了僅限十個同時連線,並且只允許建置一個網站的 IIS 5.1(2001 年十月);IIS 5.0 和 5.1 都提供了 ASP 3.0。
2003 年四月推出的 Windows Server 2003(以及 2005 年四月推出的 Windows XP Professional x64 Edition)內建了 IIS 6.0,雖然還是可以執行「傳統」的 ASP 3.0 程式,但 ASP.NET 1.0 才是最大的特點。ASP.NET 是微軟 .NET 平台的重要功能之一,.NET 1.0 是 2002 年一月推出,而微軟也在 2005 年 11 月推出 .NET 2.0,其中也包含了 ASP.NET 2.0 技術。
除了 Windows XP Professional,上述提供 IIS 的作業系統都僅限於伺服端的 Windows,如果是 Windows 95/98/98SE 等用戶端作業系統想要擁有 Web 網站功能,微軟提供的解決方案是PWS(Personal Web Server);PWS 可視為功能簡化、適用於開發測試的 Windows 免費 Web 伺服軟體,但後來也不再繼續發展。而 Windows XP Home 則是都不支援 IIS 或 PWS 的 Windows 作業系統。
早期可以免費下載、安裝的 PWS,以及 Windows XP Professional 內建的 IIS 5.1,是微軟原本提供作為個人開發測試或學習的 Windows Web 伺服軟體,後來微軟也另外為 ASP.NET 1.x 提供了適用於個人開發測試或學習並且能免費下載、安裝的簡易 Web 伺服軟體,也就是 ASP.NET Cassini Web Server,而此軟體後續的 ASP.NET 2.0 版本也內建於 Visual Studio 2005。
不過合計有六個版本 Windows Vista,也並非每個版本都提供了 Web 伺服器功能,甚至不同的 Windows Vista 版本,所提供 IIS 7 功能也有差別。首先,基礎且入門的 Windows Vista Starter 和 Home Editions 版本並不提供 IIS 7 功能。再者,Windows Vista Home Premium Edition 雖然內建 IIS 7,但僅包括 Web 網站的執行功能,不包含 FTP 伺服端、Web 驗證及授權、遠端管理等功能。Windows Vista 眾版本當中,IIS 7 功能最完整的是 Business、Enterprise、Ultimate Editions 等版本,但若相較於 Windows Server Longhorn 的 IIS 7,依然缺少遠端管理的功能。
重新模組化設計的 IIS 7 可以依照功能安裝、執行伺服端裡的模組,重新架構之後的模組化設計,讓 IIS 7 更能彈性的執行與擴充。具體而言,首見的優點就是降低伺服器資源的耗用(例如記憶體和處理器),並且提升 Web 伺服端的效能。其次的優點,是能避免不必要的攻擊,而且也能自訂特定目的或功能的專屬伺服端。
Windows Vista RC1 預設並不會安裝 IIS 7,而若透過控制台的功能安裝 IIS 7,就會發現 IIS 7 的安裝選項變得非常細微,這些安裝選項先分成 FTP 服務、Web 管理工具、Web 服務等三大類,其中的 Web 服務又分成 Application Development Features、Common Help Features、Health and Diagnostics、Performance Features、Security 等五類,這五類又再分成 28 項。例如您可以利用 Application Development Features 決定 IIS 7 所能執行的 Web 程式類型(如圖一,共七種;圖二列出了 IIS 7 完整的元件);而這些類型又互有相依性,例如若選取 ASP.NET,安裝程式會自動再選取 .NET Extensibility、ISAPI Extensions、ISAPI Filters 等三種類型。
圖一:Application Development Features 包含了七種 IIS 7 所能執行的 Web 程式類型
IIS 7 的模組可以是 Win32 DLL 原生模組,也可以是 .NET 2.0 組件管理模組(managed module),將這些模組加入伺服端,就如同以堆積木的方式擴充伺服端或網站應用程式(Web application)的功能,而 IIS 7 所有的模組也都能移除或更換;有兩種 API 可以讓開發人員編寫 IIS 7 模組:C++ API 和 ASP.NET 2.0 API,以前者編寫的 IIS 7 模組類似 ISAPI filter 或 ISAPI extension。
圖二:IIS 7 完整的元件(圖片來源:www.iis.net)
IIS 7 提供了兩種管理模組的方式,一是利用 MMC 圖形模式的管理工具(如圖三),另一種方式是命令列工具 APPCMD.EXE(位於 %WinDir%\System32\InetSrv 目錄,而且 Windows Vista RC1 命令列環境的 Path 變數內預設並沒有上述目錄)。
圖三:IIS 7 的 MMC 圖形模式管理工具
IIS 7 不只能像 IIS 6 執行 ASP.NET 2.0 網站應用程式,而且也比之前的 IIS 版本更充分整合了 .NET 的能力;例如之前所述,IIS 7 能執行 ASP.NET 2.0 API 所開發的模組,即為例證之一。而 IIS 7 之所以能與 .NET 充分整合,是因為架構的改變。
在之前的 IIS,ASP.NET 是以 IIS ISAPI extension 的方式實作而外加到 IIS,其實包括 ASP 以及 PHP,也都以相同的方式實作(PHP 在 IIS 採用了兩種實作方式,除了 IIS ISAPI extension 的方式,也包括了 CGI 的方式,系統管理者能選擇 PHP 程式的執行方式),因此用戶端對 IIS 的 HTTP 要求會先經由 IIS 處理,然後 IIS 根據要求的內容類型,如果是 HTML 靜態網頁就由 IIS 自行處理,如果不是,就根據要求的內容類型,分派給各自的 IIS ISAPI extension;如果要求的內容類型是 ASP.NET,就分派給負責處理 ASP.NET 的 IIS ISAPI extension,也就是 aspnet_isapi.dll。圖四是這個架構的示意圖。
圖四:IIS 6 的執行架構(圖片來源:www.iis.net)
而 IIS 7 完全整合 .NET 之後,架構的處理順序有了很大的不同(如圖五),最主要的原因就是 ASP.NET 從 IIS 外掛程式(ISAPI extension)的角色,進入了 IIS 核心,而且也能以 ASP.NET 模組負責處理 IIS 7 的諸多類型要求。這些 ASP.NET 模組不只能處理 ASP.NET 網頁程式,也能處理其他如 ASP 程式、PHP 程式或靜態 HTML 網頁,也因為 ASP.NET 的諸多功能已經成為 IIS 7 的一部份,因此 ASP 程式、PHP 程式或靜態 HTML 網頁等類型的要求,也能使用像是表單認證(Forms Authentication)或輸出快取(Output Cache)等 ASP.NET 2.0 的功能(但須修改 IIS 7 的設定值)。也因為 IIS 7 允許自行以 ASP.NET API 開發並加入模組,因此 ASP.NET 網頁開發人員將更容易擴充 IIS 7 和網站應用程式的功能,甚至能自行以 .NET 編寫管理 IIS 7 的程式(例如以程式控制 IIS 7 以建置網站或虛擬目錄)。
圖五:IIS 7 的執行架構(圖片來源:www.iis.net)
雖然 IIS 7 提供了新的 .NET 整合模式,但還是保留了傳統的 ASP.NET 執行模式,因為某些 ASP.NET 網站應用程式在新的 .NET 整合模式執行,可能會有相容性的問題,如果真的發生,除了找出、修改造成相容性的問題,也可以讓 ASP.NET 網站應用程式繼續以傳統的 ASP.NET 模式執行。而不論新的 .NET 整合模式,或者傳統的 ASP.NET 執行模式,都是 IIS 7 應用程式集區的 Managed pipeline mode 設定值,因此,若要讓 ASP.NET 網站應用程式以傳統的 ASP.NET 模式執行,就是將 ASP.NET 網站應用程式放到屬性為傳統 ASP.NET 模式的應用程式集區。
Windows Vista RC1 的 IIS 7 預設建了兩個應用程式集區,分別是 Class .NET AppPool 和 DefaultAppPool,前者是傳統 ASP.NET 模式,後者是新的 .NET 整合模式。如果要讓 ASP.NET 網站應用程式繼續以傳統的 ASP.NET 模式執行,就是將 ASP.NET 網站應用程式指定給傳統的 ASP.NET 模式的應用程式集區,例如 Class .NET AppPool(如圖六),或者是您自建的傳統 ASP.NET 模式應用程式集區。
圖六:指定網站應用程式的應用程式集區
雖然 IIS 已經是 Windows 平台最成功的 Web 伺服軟體,不過對現今的網際網路應用而言,Web伺服軟體必須朝向網站應用程式的執行平台發展,並且必須提供穩定、安全、易於管理的執行環境。微軟在推出 IIS 6.0 的時候,為 IIS 6.0 加入了應用程式集區的技術,讓網站應用程式更穩定、更有效率。而微軟除了重新調整 IIS 7 的架構,讓 IIS 7 充分的模組化,又將 .NET 技術整合到新的 IIS 7,讓 ASP.NET 不只能開發網站應用程式,也能開發 IIS 7 模組,等於是多開闢了一種擴充 IIS 7 的方法。
參考資料: