傳統模式是為了與之前的版本相容,使用ISAPI擴充來調用ASP.NET運行庫,原先運行於IIS6.0下的Web應用程式遷移到IIS7.0中只要將應用程式配置成傳統模式,代碼基本不用修改就可以正常運行。整合模式是一種統一的哀求處理管道,它將ASP.NET請求管道與IIS核心管道組合在一起,這種模式能夠提供更好的效能,能夠實現配置和治理的模組化,而且增加了使用Managed 程式碼模組擴充IIS時的靈活性。假如老的Web應用程式運行於IIS7.0的整合模式下,可能需要對應用程式的web.config檔案進行修改,尤其是使用了實現IHttpHandler介面的自訂模組的情況。IIS7.0在同一個伺服器上能夠同時支援兩種模式的應用程式。
IIS6.0中ASP.NET MMC嵌入式管理單元用於配置ASP.NET,7.0中ASP.NET應用程式的管理域IIS管理更加緊密的整合在一起,不存在單獨的嵌入式管理單元,所有的IIS和ASP.NET配置都是使用IIS管理器完成的。IIS7.0配置資訊基於.NET framework配置系統,所以IIS7.0中啟動並執行應用程式的web.config檔案同時包含web伺服器和ASP.NET配置設定,例如可以再web.config檔案中設定副檔名和檔案的映射(IIS6.0中必須在IIS中進行配置)。
web.config檔案的變化
system.webServer節指定了應用於web應用程式的IIS7.0設定,其父節點是configuration,該節點中可以設定的內容包括:
當請求未包含指定資源時,Web伺服器返回給用戶端的預設文件(defaultDocument); 響應的壓縮設定(httpCompression) 自訂頭部(httpProtocol節的customHeaders) 模組(modules) 處理常式(handlers)
其中的一些設定僅適用於整合模式,而不適用於傳統模式,如傳統模式下啟動並執行應用程式則忽略web.config的system.WebServer節中指定的所有Managed 程式碼模組和處理常式,這種模式下web應用程式應該在syste.web節的httpModules和httpHandlers中定義模組和處理常式。
將 Web 應用程式遷移到整合模式
不包含自訂模組或處理常式的 Web 應用程式通常無需更改即可在 IIS 7.0 整合模式下正常工作。對於依靠於自訂模組或處理常式的 Web 應用程式,需要執行以下步驟來使其能夠在整合模式下運行:
使用本主題稍後的將 Web Config 檔案遷移到整合模式部分中描述的方法之一,在 Web.config 檔案的 system.webServer 節中註冊自訂模組和處理常式。
僅在自訂模組的 Init 方法中定義 HttpApplication 請求管道事件(如 BeginRequest 和 EndRequest)的事件處理常式。
請確保您已解決 Upgrading ASP.NET Applications to IIS 7.0: Differences between IIS 7.0 Integrated Mode and Classic mode(將 ASP.NET 應用程式升級到 IIS 7.0:IIS 7.0 整合模式和傳統模式之間的區別)的“Known Differences Between Integrated Mode and Classic Mode”(整合模式和傳統模式之間的已知區別)部分中討論的問題。
實現 IHttpModule 介面的模組被稱為Managed 程式碼模組,因為它們是使用 .NET framework 產生的。可以在伺服器層級或應用程式層級註冊Managed 程式碼模組。機器碼模組是僅在伺服器層級註冊的 DLL(Unmanaged 程式碼)。在整合模式下,將以託管模組的形式實現核心 ASP.NET 功能,例如工作階段狀態和 Forms 身分識別驗證。
在將應用程式從傳統模式遷移到整合模式時,可以保留傳統模式下的自訂模組和處理常式註冊,也可以將這些註冊移除。如果不移除傳統模式下使用的 httpModules 和 httpHandlers 註冊,則必須將 validation 元素的 validateIntegratedModeConfiguration 屬性設定為 false 以避免錯誤。validation 元素是 system.webServer 元素的子項目。有關更多資訊,請參見 ASP.NET Integration with IIS 7.0(將 ASP.NET 與 IIS 7.0 整合)中的“Disabling the migration message”(禁用遷移訊息)部分。
遷移 Web.config 檔案以便在整合模式下使用
如果模組或處理常式是在應用程式層級定義的,則不會自動調用該模組或處理常式。這涉及符合以下條件的模組或處理常式:在 Bin 檔案夾下的程式集中定義;在 App_Code 檔案夾下作為原始碼定義;沒有在 Web.config 檔案的 system.webServer 節中註冊和定義。為了使模組或處理常式能夠參與整合模式請求管道,必須使用下列方法之一註冊該模組或處理常式:
直接編輯 Web.config 檔案,並且將 modules 或 handlers 元素添加到 system.webServer 元素中。請注重,與傳統模式相比,元素名稱是不同的:modules 和 handlers 分別對應於傳統模式下的 httpModules 和 httpHandlers。
使用 IIS 管理器配置模組或處理常式。有關更多資訊,請參見 Configuring Handler Mappings in IIS 7.0(在 IIS 7.0 中配置處理常式映射)和 Configuring Modules in IIS 7.0(在 IIS 7.0 中配置模組)。
使用 IIS 7.0 命令列工具 (Appcmd.exe)。有關更多資訊,請參見 Configure Settings for a Site Application Virtual Directory or URL by Using Appcmd.exe(使用 Appcmd.exe 配置網站、應用程式、虛擬目錄或 URL 的設定)。
用來使用整合模式的類和屬性
在 IIS 7.0 整合模式以及 .NET framework 3.0 版或更高版本中使用應用程式時,可以使用下面這些在傳統模式下停用類和成員:
HttpResponse 對象的 SubStatusCode 屬性,使用它可以設定在配置了失敗請求跟蹤的情況下有用的代碼。有關更多資訊,請參見 Troubleshooting Failed Requests Using Failed Request Tracing in IIS 7.0(使用 IIS 7.0 中的跟蹤功能解決請求失敗的問題)。
HttpResponse 對象的 Headers 屬性,使用它可以訪問回應標頭。
HttpContext 對象的 IsPostNotification 和 CurrentNotification 屬性,在提供 HttpApplication 事件的處理常式時可以使用它們。
HttpRequest 對象的 Headers 和 ServerVariables 屬性,它們支援寫功能。