將 ASP.NET 應用程式從 IIS 6.0 移至 IIS 7.0
更新:2007 年 11 月
本主題說明如何將 Web 應用程式從 Internet Information Services (IIS) 6.0 移到 IIS 7.0。IIS 7.0 中的 Web 應用程式可以設定為使用「傳統」模式或「整合」模式。傳統模式保留了舊版 IIS 的回溯相容性 (Backward Compatibility),保留的方式則是使用 ISAPI 擴充程式來叫用 ASP.NET 執行階段。這個選項通常不太需要或完全不需要修改現有的應用程式。
IIS 7.0 整合模式是統一的要求處理管線,其結合了 ASP.NET 要求管線和 IIS 核心要求管線。這個整合管線不僅能夠改善效能、提供模組化的組態和管理功能,也能夠提高以 Managed 程式碼模組擴充 IIS 的彈性。例如,您可以在 Web 應用程式的 App_Code 資料夾中定義 Managed 程式碼模組,並登錄該模組,以套用到包括靜態 (Static) 檔案的所有 IIS 要求。
使用 IIS 7.0 整合模式可能需要對應用程式的 Web.config 檔進行少許變更。如果應用程式使用實作 IHttpModule 介面的任何自訂模組,則可能還需要進行一些額外的變更。
如需 IIS 7.0 整合模式中要求處理管線的概觀,請參閱 IIS 7.0 的 ASP.NET 應用程式生命週期概觀。在使用 IIS 7.0 時,您可以在同一部伺服器上同步使用傳統模式和整合模式來執行應用程式。傳統模式和整合模式都能夠支援 .NET Framework 2.0 版 (含) 以後版本,而只有傳統模式支援 .NET Framework 1.1 版。如需如何從舊版 IIS 升級為 IIS 7.0 的詳細資訊,請參閱將 ASP.NET 應用程式升級為 IIS 7.0:IIS 7.0 整合模式與傳統模式的差異 (英文)。
注意事項: |
---|
您可以利用本主題提供的資訊,將 Web 應用程式從 IIS 5.x 移至 IIS 7.0。但是,可能需要做一些變更,在此先不做討論。如需詳細資訊,請參閱 。 |
此主題包括下列章節:
IIS 7.0 中的 Web.config 檔案
將 Web 應用程式移至傳統模式
將 Web 應用程式移至整合模式
IIS 7.0 中的 Web.config 檔案
當您將 ASP.NET Web 應用程式移至 IIS 7.0 整合模式時,必須更新 Web.config 檔案。IIS 7.0 包含的變更包括管理 Web.config 檔案的方式,以及 Web.config 檔案中可以儲存的設定類型。新增的設定位於稱為 system.webServer 新組態區段中。
在 IIS 6.0 中,ASP.NET MMC 嵌入式管理單元提供用來設定 ASP.NET 的 IIS 相關管理功能。如需詳細資訊,請參閱逐步解說:使用 MMC 設定 IIS 6.0 中的 ASP.NET 應用程式。
在 IIS 7.0 中,ASP.NET 應用程式的管理與 IIS 管理的整合更為緊密,而且沒有獨立的嵌入式管理單元。相反地,所有的 IIS 和 ASP.NET 組態都是使用 IIS 管理員來進行。由於 IIS 7.0 組態資訊是以 .NET Framework 的組態系統做為基礎,因此在 IIS 7.0 中執行之應用程式的 Web.config 檔案將同時包含 Web 伺服器和 ASP.NET 的組態設定。例如,在 IIS 7.0 中執行的 ASP.NET 應用程式之 Web.config 檔案中,您可以指定當瀏覽器沒有要求特定檔案時所要傳回的預設檔案(在 IIS 6.0 和較早的 IIS 版本中,這是 IIS Metabase 中所維護的設定)。
編輯 Web.config 檔案
您可以使用下列方式,變更在 IIS 7.0 中執行之 Web 應用程式的 Web.config 檔案:
使用 Visual Studio 或 Visual Web Developer,或是利用文字編輯程式,直接編輯 Web.config 檔案。
使用 IIS 管理員。如需詳細資訊,請參閱 Internet Information Services (IIS) 管理員 (英文)。
使用 ASP.NET 網站管理工具。如需詳細資訊,請參閱 ASP.NET 網站管理工具。
注意事項: 在網站管理工具中所做的變更並不會影響 system.webServer 項目中的子組態項目。
使用 IIS 7.0 命令列工具 (Appcmd.exe)。這個公用程式可以讓您在命令列指定 IIS 組態設定和 Web 應用程式組態設定。如需詳細資訊,請參閱 IIS 7.0 命令列工具 (英文)。
system.webServer 區段
Web.config 檔案中的 system.webServer 組態區段會指定套用到 Web 應用程式的 IIS 7.0 設定。system.WebServer 區段是組態項目的子項。如需詳細資訊,請參閱 IIS 7.0: system.webServer 區段群組 (IIS 設定結構描述) (英文)。
您可以在 system.WebServer 組態群組中設定的 Web 伺服器設定範例包括下列各項:
當要求不包括特定資源時,Web 伺服器傳回給用戶端的預設文件 (defaultDocument 項目)。
回應的壓縮設定 (httpCompression 項目)。
自訂標頭 (httpProtocol 區段的 customHeaders 項目)。
模組 (modules 項目)。
處理常式 (handlers 項目)。
某些設定只適用於 IIS 7.0 整合模式,不適用於傳統模式。例如,如果應用程式以傳統模式執行,便會忽略 Web.config 檔案中 system.WebServer 區段所指定的任何 Managed 程式碼模組和處理常式。如同舊版的 IIS,您必須改用 system.web 區段的 httpModules 和 httpHandlers 項目來定義 Managed 程式碼模組和處理常式。
如需使用 system.webServer 組態區段的範例,請參閱 HOW TO:設定 IIS 7.0 的 <system.webServer> 區段。
將 Web 應用程式移至傳統模式
一般來說,如果要將 Web 應用程式從 IIS 6.0 移到 IIS 7.0 傳統模式,您只需要將應用程式放到以傳統模式執行的應用程式集區即可。例如,當您使用 安裝 IIS 7.0 時,預設會將 Web 伺服器設定成以整合模式運作。此外,Web 伺服器也會設定成在預設應用程式集區 (名稱為 DefaultAppPool) 下執行。若要以傳統模式執行 Web 應用程式,請使用 Classic.NETAppPool 應用程式,或建立設定成以傳統模式執行的新應用程式集區。如需如何建立應用程式集區的詳細資訊,請參閱建立應用程式集區 (英文)。
在以傳統模式執行的應用程式中,實作 IHttpModule 介面的任何自訂模組,都只會收到由 ASP.NET 執行階段所處理之管線要求的相關通知。例如,這些模組會收到有關 .aspx 網頁要求的通知。傳統模式的應用程式生命週期與 IIS 6.0 中 ASP.NET 的生命週期相同。如需詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀。
如果以傳統模式執行的應用程式包含的處理常式需要有指令碼對應,才能處理 IIS 中的自訂副檔名,您必須在 httpHandler 群組和 handler 群組中同時註冊該處理常式。請藉由在 handler 項目中指定 modules 和 scriptProcessor 屬性 (Attribute),將自訂副檔名對應到 ASP.NET ISAPI 副檔名 (Aspnet_isapi.dll)。這兩個屬性指定定義處理常式的模組是 ISAPI 擴充程式,而且也指定了該擴充程式的路徑。這是 IIS 7.0 傳統模式針對舊版 IIS 提供回溯相容性的方式。不過,如果您以整合模式執行應用程式,則必須移除 modules 和 scriptProcessor 屬性。如需詳細資訊,請參閱 HOW TO:在 IIS 中設定 HTTP 處理常式副檔名。
當您將 Web 應用程式從 IIS 6.0 移到傳統模式時,我們無法保證在不做任何變更的情況下,應用程式也能夠在整合模式下運作。如果您將應用程式從傳統模式切換到整合模式,並變更任何自訂模組和處理常式,您可能必須另外進行其他變更,應用程式才能在整合模式下正確執行。本主題的下一節會說明如何將應用程式移到 IIS 7.0 整合模式。
將 Web 應用程式移至整合模式
不含自訂模組或處理常式的 Web 應用程式,通常不需要進行任何變更就可以在 IIS 7.0 中以整合模式執行,而依賴自訂模組或處理常式的 Web 應用程式則必須執行下列步驟,才能以整合模式執行應用程式:
使用本主題稍後的將 Web 組態檔移轉至整合模式一節中說明的其中一種方法,在 Web.config 檔案的 system.webServer 區段中註冊自訂模組和處理常式。
只在自訂模組的 Init 方法中定義 HttpApplication 要求管線事件 (例如 BeginRequest 和 EndRequest) 的事件處理常式。
確定您已解決將 ASP.NET 應用程式升級為 IIS 7.0:IIS 7.0 整合模式與傳統模式的差異中<整合模式與傳統模式的已知差異>一節 (英文) 所討論的任何問題。
我們將實作 IHttpModule 介面的模組稱為 Managed 程式碼模組,因為它們是利用 .NET Framework 所建置的模組。Managed 程式碼模組可以在伺服器層級或應用程式層級註冊。機器碼模組則是只在伺服器層級註冊的 DLL (非 Managed 程式碼)。核心 ASP.NET 功能 (例如工作階段狀態和表單驗證) 在整合模式中都會實作成 Managed 模組。
當您將應用程式從傳統模式移到整合模式時,您可以保留傳統模式的自訂模組和處理常式註冊,也可以移除這些註冊。如果您沒有移除傳統模式中使用的 httpModules 和 httpHandlers 註冊,則必須將 validation 項目的 validateIntegratedModeConfiguration 屬性設定為 false,以免發生錯誤。validation 項目是 system.webServer 項目的子項目。如需詳細資訊,請參閱 ASP.NET 與 IIS 7.0 的整合中的<停用移轉訊息>一節 (英文)。
移轉 Web.config 檔案以便在整合模式中使用
如果模組或處理常式是在應用程式等級定義,系統就不會自動叫用該模組或處理常式。這包括在 Bin 資料夾的組件中定義、或是在 App_Code 資料夾中定義成原始程式碼的模組或處理常式,而且這些的模組或處理常式沒有在 Web.config 檔案的 system.webServer 區段中註冊或定義。如果要讓模組或處理常式加入整合模式要求管線,您必須使用下列其中一種方法註冊該模組或處理常式:
直接編輯 Web.config 並將 modules 或 handlers 項目加入至 system.webServer 項目。請注意,其與傳統模式的差異在於項目名稱,modules 相對於 httpModules,而 handlers 相對於 httpHandlers。
使用 IIS 管理員設定模組或處理常式。如需詳細資訊,請參閱在 IIS 7.0 中設定處理常式對應 (英文) 和在 IIS 7.0 中設定模組 (英文)。
使用 IIS 7.0 命令列工具 (Appcmd.exe)。如需詳細資訊,請參閱使用 Appcmd.exe 設定網站、應用程式、虛擬目錄或 URL 的設定 (英文)。
使用整合模式的子句和屬性
在 IIS 7.0 整合模式和 .NET Framework 3.0 版 (含) 以後版本中使用應用程式時,您可以使用無法在傳統模式中使用的下列類別和成員:
HttpResponse 物件的 SubStatusCode 屬性,可讓您設定程式碼以用於已設定失敗要求追蹤的情況。如需詳細資訊,請參閱使用 IIS 7.0 的失敗要求追蹤功能疑難排解失敗的要求 (英文)。
HttpResponse 物件的 Headers 屬性,可用來存取回應標頭。
HttpContext 物件的 IsPostNotification 和 CurrentNotification 屬性,可在您提供 HttpApplication 事件的處理常式時使用。
HttpRequest 物件的 Headers 和 ServerVariables 屬性 (可編輯)。