IIS7 經(jīng)典模式和集成模式的區(qū)別分析
2024-08-29 03:15:21
供稿:網(wǎng)友
經(jīng)典模式是為了與之前的版本兼容,使用ISAPI擴(kuò)展來(lái)調(diào)用ASP.NET運(yùn)行庫(kù),原先運(yùn)行于IIS6.0下的Web應(yīng)用程序遷移到IIS7.0中只要將應(yīng)用程序配置成經(jīng)典模式,代碼基本不用修改就可以正常運(yùn)行。集成模式是一種統(tǒng)一的哀求處理管道,它將ASP.NET請(qǐng)求管道與IIS核心管道組合在一起,這種模式能夠提供更好的性能,能夠?qū)崿F(xiàn)配置和治理的模塊化,而且增加了使用托管代碼模塊擴(kuò)展IIS時(shí)的靈活性。假如老的Web應(yīng)用程序運(yùn)行于IIS7.0的集成模式下,可能需要對(duì)應(yīng)用程序的web.config文件進(jìn)行修改,尤其是使用了實(shí)現(xiàn)IHttpHandler接口的自定義模塊的情況。IIS7.0在同一個(gè)服務(wù)器上能夠同時(shí)支持兩種模式的應(yīng)用程序。
IIS6.0中ASP.NET MMC管理單元用于配置ASP.NET,7.0中ASP.NET應(yīng)用程序的管理域IIS管理更加緊密的集成在一起,不存在單獨(dú)的管理單元,所有的IIS和ASP.NET配置都是使用IIS管理器完成的。IIS7.0配置信息基于.NET framework配置系統(tǒng),所以IIS7.0中運(yùn)行的應(yīng)用程序的web.config文件同時(shí)包含web服務(wù)器和ASP.NET配置設(shè)置,例如可以再web.config文件中設(shè)置擴(kuò)展名和文件的映射(IIS6.0中必須在IIS中進(jìn)行配置)。
web.config文件的變化
system.webServer節(jié)指定了應(yīng)用于web應(yīng)用程序的IIS7.0設(shè)置,其父節(jié)點(diǎn)是configuration,該節(jié)點(diǎn)中可以設(shè)置的內(nèi)容包括:
當(dāng)請(qǐng)求未包含指定資源時(shí),Web服務(wù)器返回給客戶端的默認(rèn)文檔(defaultDocument); 響應(yīng)的壓縮設(shè)置(httpCompression) 自定義頭部(httpProtocol節(jié)的customHeaders) 模塊(modules) 處理程序(handlers)
其中的一些設(shè)置僅適用于集成模式,而不適用于經(jīng)典模式,如經(jīng)典模式下運(yùn)行的應(yīng)用程序則忽略web.config的system.WebServer節(jié)中指定的所有托管代碼模塊和處理程序,這種模式下web應(yīng)用程序應(yīng)該在syste.web節(jié)的httpModules和httpHandlers中定義模塊和處理程序。
將 Web 應(yīng)用程序遷移到集成模式
不包含自定義模塊或處理程序的 Web 應(yīng)用程序通常無(wú)需更改即可在 IIS 7.0 集成模式下正常工作。對(duì)于依靠于自定義模塊或處理程序的 Web 應(yīng)用程序,需要執(zhí)行以下步驟來(lái)使其能夠在集成模式下運(yùn)行:
使用本主題稍后的將 Web Config 文件遷移到集成模式部分中描述的方法之一,在 Web.config 文件的 system.webServer 節(jié)中注冊(cè)自定義模塊和處理程序。
僅在自定義模塊的 Init 方法中定義 HttpApplication 請(qǐng)求管道事件(如 BeginRequest 和 EndRequest)的事件處理程序。
請(qǐng)確保您已解決 Upgrading ASP.NET Applications to IIS 7.0: Differences between IIS 7.0 Integrated Mode and Classic mode(將 ASP.NET 應(yīng)用程序升級(jí)到 IIS 7.0:IIS 7.0 集成模式和經(jīng)典模式之間的區(qū)別)的“Known Differences Between Integrated Mode and Classic Mode”(集成模式和經(jīng)典模式之間的已知區(qū)別)部分中討論的問(wèn)題。
實(shí)現(xiàn) IHttpModule 接口的模塊被稱為托管代碼模塊,因?yàn)樗鼈兪鞘褂?.NET framework 生成的。可以在服務(wù)器級(jí)別或應(yīng)用程序級(jí)別注冊(cè)托管代碼模塊。本機(jī)代碼模塊是僅在服務(wù)器級(jí)別注冊(cè)的 DLL(非托管代碼)。在集成模式下,將以托管模塊的形式實(shí)現(xiàn)核心 ASP.NET 功能,例如會(huì)話狀態(tài)和 Forms 身份驗(yàn)證。
在將應(yīng)用程序從經(jīng)典模式遷移到集成模式時(shí),可以保留經(jīng)典模式下的自定義模塊和處理程序注冊(cè),也可以將這些注冊(cè)移除。如果不移除經(jīng)典模式下使用的 httpModules 和 httpHandlers 注冊(cè),則必須將 validation 元素的 validateIntegratedModeConfiguration 屬性設(shè)置為 false 以避免錯(cuò)誤。validation 元素是 system.webServer 元素的子元素。有關(guān)更多信息,請(qǐng)參見 ASP.NET Integration with IIS 7.0(將 ASP.NET 與 IIS 7.0 集成)中的“Disabling the migration message”(禁用遷移消息)部分。
遷移 Web.config 文件以便在集成模式下使用
如果模塊或處理程序是在應(yīng)用程序級(jí)別定義的,則不會(huì)自動(dòng)調(diào)用該模塊或處理程序。這涉及符合以下條件的模塊或處理程序:在 Bin 文件夾下的程序集中定義;在 App_Code 文件夾下作為源代碼定義;沒有在 Web.config 文件的 system.webServer 節(jié)中注冊(cè)和定義。為了使模塊或處理程序能夠參與集成模式請(qǐng)求管道,必須使用下列方法之一注冊(cè)該模塊或處理程序:
直接編輯 Web.config 文件,并且將 modules 或 handlers 元素添加到 system.webServer 元素中。請(qǐng)注重,與經(jīng)典模式相比,元素名稱是不同的:modules 和 handlers 分別對(duì)應(yīng)于經(jīng)典模式下的 httpModules 和 httpHandlers。
使用 IIS 管理器配置模塊或處理程序。有關(guān)更多信息,請(qǐng)參見 Configuring Handler Mappings in IIS 7.0(在 IIS 7.0 中配置處理程序映射)和 Configuring Modules in IIS 7.0(在 IIS 7.0 中配置模塊)。
使用 IIS 7.0 命令行工具 (Appcmd.exe)。有關(guān)更多信息,請(qǐng)參見 Configure Settings for a Site Application Virtual Directory or URL by Using Appcmd.exe(使用 Appcmd.exe 配置站點(diǎn)、應(yīng)用程序、虛擬目錄或 URL 的設(shè)置)。
用來(lái)使用集成模式的類和屬性
在 IIS 7.0 集成模式以及 .NET framework 3.0 版或更高版本中使用應(yīng)用程序時(shí),可以使用下面這些在經(jīng)典模式下不可用的類和成員:
HttpResponse 對(duì)象的 SubStatusCode 屬性,使用它可以設(shè)置在配置了失敗請(qǐng)求跟蹤的情況下有用的代碼。有關(guān)更多信息,請(qǐng)參見 Troubleshooting Failed Requests Using Failed Request Tracing in IIS 7.0(使用 IIS 7.0 中的跟蹤功能解決請(qǐng)求失敗的問(wèn)題)。
HttpResponse 對(duì)象的 Headers 屬性,使用它可以訪問(wèn)響應(yīng)頭。
HttpContext 對(duì)象的 IsPostNotification 和 CurrentNotification 屬性,在提供 HttpApplication 事件的處理程序時(shí)可以使用它們。
HttpRequest 對(duì)象的 Headers 和 ServerVariables 屬性,它們支持寫功能。