IIS 7.0 的 ASP.NET 应用程序生命周期概述
本主題介紹在 IIS 7.0 集成模式下運(yùn)行以及與 .NET Framework 3.0 或更高版本一起運(yùn)行的 ASP.NET 應(yīng)用程序的應(yīng)用程序生命周期。IIS 7.0 還支持經(jīng)典模式,其行為類(lèi)似于在 IIS?6.0 中運(yùn)行的 ASP.NET。有關(guān)更多信息,請(qǐng)參見(jiàn) IIS 5.0 和 6.0 的 ASP.NET 應(yīng)用程序生命周期概述。
IIS 7.0 集成管道是一種統(tǒng)一的請(qǐng)求處理管道,它同時(shí)支持本機(jī)代碼和托管代碼模塊。實(shí)現(xiàn) IHttpModule 接口的托管代碼模塊可訪(fǎng)問(wèn)該請(qǐng)求管道中的所有事件。例如,托管代碼模塊可用于 ASP.NET 網(wǎng)頁(yè)(.aspx 文件)和 HTML 頁(yè)(.htm 或 .html 文件)的 ASP.NET Forms 身份驗(yàn)證。即使 IIS 和 ASP.NET 將 HTML 頁(yè)視為靜態(tài)資源,情況也是如此。有關(guān) IIS 7.0 集成模式的更多信息,請(qǐng)參見(jiàn) ASP.NET Integration with IIS7(將 ASP.NET 與 IIS7 集成)。
本主題包含以下幾節(jié):
·???????? 結(jié)構(gòu)概述
·???????? 生命周期階段
·???????? 使用 Global.asax 文件
·???????? IIS?7.0 中的托管代碼模塊
結(jié)構(gòu)概述
在 IIS 7.0 集成模式下的請(qǐng)求會(huì)經(jīng)歷幾個(gè)階段,類(lèi)似于在 IIS?6.0 中對(duì) ASP.NET 資源的請(qǐng)求所經(jīng)歷的階段。但是,在 IIS 7.0 中,這些階段包含多個(gè)額外的應(yīng)用程序事件,如 MapRequestHandler、LogRequest 和 PostLogRequest 事件。
IIS 7.0 和 IIS?6.0 的處理階段之間的主要區(qū)別在于 ASP.NET 如何與 IIS 服務(wù)器集成。在 IIS?6.0 中,有兩個(gè)請(qǐng)求處理管道。一個(gè)管道用于本機(jī)代碼 ISAPI 篩選器和擴(kuò)展組件。另一個(gè)管道用于托管代碼應(yīng)用程序組件,如 ASP.NET。在 IIS 7.0 中,ASP.NET 運(yùn)行庫(kù)與 Web 服務(wù)器集成,這樣就有了一個(gè)針對(duì)所有請(qǐng)求的統(tǒng)一的請(qǐng)求處理管道。對(duì)于 ASP.NET 開(kāi)發(fā)人員,集成管道有以下益處:
集成管道引發(fā)由 HttpApplication 對(duì)象公開(kāi)的所有事件,這使現(xiàn)有 ASP.NET HTTP 模塊可在 IIS 7.0 集成模式下工作。
在 Web 服務(wù)器級(jí)別、網(wǎng)站級(jí)別或 Web 應(yīng)用程序級(jí)別,都可配置本機(jī)代碼和托管代碼模塊。這包括用于會(huì)話(huà)狀態(tài)、Forms 身份驗(yàn)證、配置文件以及角色管理的內(nèi)置 ASP.NET 托管代碼模塊。此外,可以為所有請(qǐng)求啟用或禁用托管代碼模塊,無(wú)論請(qǐng)求是否針對(duì) ASP.NET 資源(如 aspx 文件)。
可以在管道中的任何階段調(diào)用托管代碼模塊。這包括在對(duì)請(qǐng)求進(jìn)行任何服務(wù)器處理之前,在所有服務(wù)器處理都已發(fā)生之后,或者兩者間的任何階段。
可以通過(guò)應(yīng)用程序的 Web.config 文件注冊(cè)模塊,也可以啟用或禁用模塊。
下面的插圖演示應(yīng)用程序的請(qǐng)求管道的配置。該示例包括以下內(nèi)容:
·???????? Anonymous 本機(jī)代碼模塊和 Forms 托管代碼模塊(對(duì)應(yīng)于 [T:System.Web.Security.FormsAuthenticationModule)])。這些模塊都已配置,并在請(qǐng)求的Authentication階段調(diào)用。
·???????? Basic 本機(jī)代碼模塊和 Windows 托管代碼模塊(對(duì)應(yīng)于 WindowsAuthenticationModule)。它們雖然顯示,但并沒(méi)有為應(yīng)用程序進(jìn)行配置。
·???????? 在 Execute handler 階段,會(huì)調(diào)用處理程序(應(yīng)用范圍為 URL 的模塊)以構(gòu)造響應(yīng)。對(duì)于 .aspx 文件,使用 PageHandlerFactory 處理程序來(lái)響應(yīng)請(qǐng)求。對(duì)于靜態(tài)文件,本機(jī)代碼 StaticFileModule 模塊響應(yīng)請(qǐng)求。
·???????? Trace 本機(jī)代碼模塊。此模塊雖然顯示,但并沒(méi)有為應(yīng)用程序進(jìn)行配置。
·???????? Custom module 托管代碼類(lèi)。該類(lèi)在 Log request 階段中調(diào)用。
有關(guān)從早期版本的 IIS 遷移到 IIS 7.0 的 ASP.NET 應(yīng)用程序的已知兼容性問(wèn)題的信息,請(qǐng)參見(jiàn) 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ū)別)部分。
生命周期階段
下表列出了在 IIS 7.0 集成模式下運(yùn)行的 ASP.NET 應(yīng)用程序生命周期的各個(gè)階段。
| 階段 |
說(shuō)明
發(fā)出一個(gè)對(duì)應(yīng)用程序資源的請(qǐng)求。
ASP.NET 應(yīng)用程序的生命周期以瀏覽器向 Web 服務(wù)器發(fā)送請(qǐng)求為起點(diǎn)。
在 IIS 7.0 經(jīng)典模式下以及在 IIS?6.0 中,ASP.NET 請(qǐng)求管道與 Web 服務(wù)器管道分離。模塊僅應(yīng)用于路由到 ASP.NET ISAPI 擴(kuò)展的請(qǐng)求。如果請(qǐng)求的資源類(lèi)型的文件擴(kuò)展名未顯式映射到 ASP.NET,則不會(huì)為該請(qǐng)求調(diào)用 ASP.NET 功能,因?yàn)?/span> ASP.NET 運(yùn)行庫(kù)沒(méi)有處理該請(qǐng)求。
而在 IIS 7.0 集成模式下,由一個(gè)統(tǒng)一的管道處理所有請(qǐng)求。當(dāng)集成管道收到請(qǐng)求時(shí),該請(qǐng)求將經(jīng)歷所有請(qǐng)求共有的一些階段。這些階段由 RequestNotification 枚舉表示。所有請(qǐng)求都可以配置為使用 ASP.NET 功能,因?yàn)樵摴δ芊庋b在可以訪(fǎng)問(wèn)請(qǐng)求管道的托管代碼模塊中。例如,即使 .htm 文件擴(kuò)展名未顯式映射到 ASP.NET,對(duì) HTML 頁(yè)的請(qǐng)求仍會(huì)調(diào)用 ASP.NET 模塊。這使您能對(duì)所有資源使用 ASP.NET 身份驗(yàn)證和授權(quán)。
統(tǒng)一管道接收對(duì)應(yīng)用程序的第一個(gè)請(qǐng)求。
當(dāng)統(tǒng)一管道接收對(duì)應(yīng)用程序中的任何資源的第一個(gè)請(qǐng)求時(shí),將為 ApplicationManager 類(lèi)創(chuàng)建一個(gè)實(shí)例,該實(shí)例就是處理請(qǐng)求的應(yīng)用程序域。應(yīng)用程序域提供了應(yīng)用程序之間全局變量的分離,并且使每個(gè)應(yīng)用程序能夠單獨(dú)卸載。在應(yīng)用程序域中,將為 HostingEnvironment 類(lèi)創(chuàng)建一個(gè)實(shí)例,該實(shí)例提供對(duì)有關(guān)應(yīng)用程序的信息(如存儲(chǔ)該應(yīng)用程序的文件夾的名稱(chēng))的訪(fǎng)問(wèn)。
在第一個(gè)請(qǐng)求期間,如果需要,將對(duì)應(yīng)用程序中的頂級(jí)項(xiàng)進(jìn)行編譯,其中包括 App_Code 文件夾中的應(yīng)用程序代碼。可以根據(jù)本主題后面的 IIS?7.0 中的托管代碼模塊中的說(shuō)明,在 App_Code 文件夾中包含自定義模塊和處理程序。
將為每個(gè)請(qǐng)求創(chuàng)建響應(yīng)對(duì)象。
在創(chuàng)建了應(yīng)用程序域并對(duì) HostingEnvironment 對(duì)象進(jìn)行了實(shí)例化之后,將創(chuàng)建并初始化應(yīng)用程序?qū)ο?#xff0c;如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 類(lèi)包含特定于當(dāng)前應(yīng)用程序請(qǐng)求的對(duì)象,如 HttpRequest 和 HttpResponse 對(duì)象。HttpRequest 對(duì)象包含有關(guān)當(dāng)前請(qǐng)求的信息,包括 Cookie 和瀏覽器信息。HttpResponse 對(duì)象包含發(fā)送到客戶(hù)端的響應(yīng),其中包括所有呈現(xiàn)的輸出和 Cookie。
下面是 IIS?6.0 和 IIS 7.0(在集成模式下,與 .NET Framework 3.0 或更高版本一起運(yùn)行)之間的某些關(guān)鍵差異:
·???????? 可以使用 HttpResponse 對(duì)象的 SubStatusCode 屬性,設(shè)置對(duì)失敗請(qǐng)求跟蹤有用的代碼。有關(guān)更多信息,請(qǐng)參見(jiàn) Troubleshooting Failed Requests Using Failed Request Tracing in IIS 7.0(使用 IIS 7.0 中的失敗請(qǐng)求跟蹤功能解決失敗請(qǐng)求存在的問(wèn)題)。
·???????? HttpResponse 對(duì)象的 Headers 屬性提供對(duì)響應(yīng)的響應(yīng)頭的訪(fǎng)問(wèn)。
·???????? 在一個(gè)事件處理程序處理多個(gè) HttpApplication 事件時(shí),可以使用 HttpContext 對(duì)象的兩個(gè)屬性 IsPostNotification 和 CurrentNotification。
·???????? HttpRequest 對(duì)象的 Headers 和 ServerVariables 屬性支持寫(xiě)操作。
將 HttpApplication 對(duì)象分配給請(qǐng)求
初始化所有應(yīng)用程序?qū)ο笾?#xff0c;將通過(guò)創(chuàng)建 HttpApplication 類(lèi)的實(shí)例來(lái)啟動(dòng)應(yīng)用程序。如果應(yīng)用程序有 Global.asax 文件,則 ASP.NET 會(huì)創(chuàng)建從 HttpApplication 類(lèi)派生的 Global.aspx 類(lèi)的實(shí)例。然后使用該派生類(lèi)來(lái)表示應(yīng)用程序。
| 注意: |
| 第一次在應(yīng)用程序中請(qǐng)求 ASP.NET 頁(yè)或進(jìn)程時(shí),將創(chuàng)建 HttpApplication 類(lèi)的一個(gè)新實(shí)例。不過(guò),為了盡可能提高性能,可對(duì)多個(gè)請(qǐng)求重復(fù)使用 HttpApplication 實(shí)例。 |
加載哪些 ASP.NET 模塊(如 SessionStateModule)取決于應(yīng)用程序從父應(yīng)用程序繼承的托管代碼模塊。這還取決于在應(yīng)用程序的 Web.config 文件的配置節(jié)中配置了哪些模塊。在應(yīng)用程序的 Web.config 的 system.webServer 節(jié)中的 modules 元素中添加或移除模塊。有關(guān)更多信息,請(qǐng)參見(jiàn)如何:為 IIS 7.0 配置 <system.webServer> 節(jié)。
由 HttpApplication 管線(xiàn)處理請(qǐng)求。
在處理請(qǐng)求時(shí),HttpApplication 類(lèi)會(huì)執(zhí)行下列任務(wù)。這些事件對(duì)于希望在引發(fā)關(guān)鍵請(qǐng)求管道事件時(shí)運(yùn)行代碼的網(wǎng)頁(yè)開(kāi)發(fā)人員很有用。如果是在開(kāi)發(fā)自定義模塊,并且希望對(duì)發(fā)往管道的所有請(qǐng)求都調(diào)用該模塊,則這些事件也很有用。自定義模塊實(shí)現(xiàn) IHttpModule 接口。在 IIS 7.0 集成模式下,必須在模塊的 Init 方法中注冊(cè)事件處理程序。
1.??? 對(duì)請(qǐng)求進(jìn)行驗(yàn)證,將檢查瀏覽器發(fā)送的信息,并確定其是否包含潛在惡意標(biāo)記。有關(guān)更多信息,請(qǐng)參見(jiàn) ValidateRequest 和腳本侵入概述。
2.??? 如果已在 Web.config 文件的 UrlMappingsSection 節(jié)中配置了任何 URL,則執(zhí)行 URL 映射。
3.??? 引發(fā) BeginRequest 事件。
4.??? 引發(fā) AuthenticateRequest 事件。
5.??? 引發(fā) PostAuthenticateRequest 事件。
6.??? 引發(fā) AuthorizeRequest 事件。
7.??? 引發(fā) PostAuthorizeRequest 事件。
8.??? 引發(fā) ResolveRequestCache 事件。
9.??? 引發(fā) PostResolveRequestCache 事件。
10.? 引發(fā) MapRequestHandler 事件。將根據(jù)所請(qǐng)求資源的文件擴(kuò)展名,選擇相應(yīng)的處理程序。處理程序可以是本機(jī)代碼模塊,如 IIS 7.0 StaticFileModule,也可以是托管代碼模塊,如 PageHandlerFactory 類(lèi)(它處理 .aspx 文件)。
11.? 引發(fā) PostMapRequestHandler 事件。
12.? 引發(fā) AcquireRequestState 事件。
13.? 引發(fā) PostAcquireRequestState 事件。
14.? 引發(fā) PreRequestHandlerExecute 事件。
15.? 為該請(qǐng)求調(diào)用合適的 IHttpHandler 類(lèi)的 ProcessRequest 方法(或異步版 IHttpAsyncHandler..::.BeginProcessRequest)。例如,如果該請(qǐng)求針對(duì)某頁(yè),則當(dāng)前的頁(yè)實(shí)例將處理該請(qǐng)求。
16.? 引發(fā) PostRequestHandlerExecute 事件。
17.? 引發(fā) ReleaseRequestState 事件。
18.? 引發(fā) PostReleaseRequestState 事件。
19.? 如果定義了 Filter 屬性,則執(zhí)行響應(yīng)篩選。
20.? 引發(fā) UpdateRequestCache 事件。
21.? 引發(fā) PostUpdateRequestCache 事件。
22.? 引發(fā) LogRequest 事件。
23.? 引發(fā) PostLogRequest 事件。
24.? 引發(fā) EndRequest 事件。
25.? 引發(fā) PreSendRequestHeaders 事件。
26.? 引發(fā) PreSendRequestContent 事件。
| 注意: |
| 只有當(dāng)應(yīng)用程序在 IIS 7.0 集成模式下運(yùn)行,并且與 .NET Framework 3.0 或更高版本一起運(yùn)行時(shí),才會(huì)支持 MapRequestHandler、LogRequest 和 PostLogRequest 事件。 |
使用 Global.asax 文件
在 IIS 7.0 集成模式下使用 Global.asax 文件與在 IIS 6.0 的 ASP.NET 中使用該文件非常相似。有關(guān)更多信息,請(qǐng)參見(jiàn) IIS 5.0 和 6.0 的 ASP.NET 應(yīng)用程序生命周期概述中的“生命周期事件和 Global.asax 文件”一節(jié)。
其中一個(gè)區(qū)別是:您可以為 MapRequestHandler、LogRequest 和 PostLogRequest 事件添加處理程序。對(duì)于在 IIS 7.0 集成模式下運(yùn)行并且與 .NET Framework 3.0 或更高版本一起運(yùn)行的應(yīng)用程序,可以支持這些事件。
可以在 Global.asax 文件中提供應(yīng)用程序事件處理程序,以添加為 ASP.NET 處理的所有請(qǐng)求(例如對(duì) .aspx 和 .axd 頁(yè)的請(qǐng)求)執(zhí)行的代碼。但是,不會(huì)調(diào)用 Global.asax 文件中的處理程序代碼來(lái)處理對(duì)非 ASP.NET 資源(如靜態(tài)文件)的請(qǐng)求。若要運(yùn)行為所有資源運(yùn)行的托管代碼,請(qǐng)創(chuàng)建一個(gè)實(shí)現(xiàn) IHttpModule 接口的自定義模塊。該自定義模塊將會(huì)運(yùn)行,以處理對(duì)應(yīng)用程序中的資源的所有請(qǐng)求,即使資源處理程序不是 ASP.NET 處理程序。
IIS?7.0 中的托管代碼模塊
可在 IIS 7.0 中配置并加載的 ASP.NET 托管代碼模塊包括下面這些:
·???????? FormsAuthenticationModule
·???????? ProfileModule
·???????? RoleManagerModule
·???????? SessionStateModule
若要配置 IIS 7.0 托管代碼模塊,可以使用以下方法之一:
·???????? 使用 IIS 管理器。有關(guān)更多信息,請(qǐng)參見(jiàn)如何:打開(kāi) IIS 管理器。
·???????? 使用 IIS 7.0 命令行工具 (Appcmd.exe)。有關(guān)更多信息,請(qǐng)參見(jiàn) IIS 7.0 Command-Line Tool(IIS 7.0 命令行工具)。
·???????? 編輯 IIS 7.0 基于 XML 的配置存儲(chǔ)區(qū)。有關(guān)更多信息,請(qǐng)參見(jiàn) IIS 7.0: IIS 7.0 Configuration Store(IIS 7.0:IIS 7.0 配置存儲(chǔ)區(qū))。
當(dāng) ASP.NET 托管代碼模塊(如 FormsAuthenticationModule 模塊)配置為在 IIS 7.0 中加載時(shí),它可以訪(fǎng)問(wèn)請(qǐng)求管道中的所有事件。這意味著所有請(qǐng)求都將通過(guò)該托管代碼模塊。對(duì)于 FormsAuthenticationModule 類(lèi),這意味著可以使用 Forms 身份驗(yàn)證來(lái)保護(hù)靜態(tài)內(nèi)容,即使這些內(nèi)容并非由 ASP.NET 處理程序進(jìn)行處理。
開(kāi)發(fā)自定義托管代碼模塊
可使用實(shí)現(xiàn) IHttpModule 接口的模塊來(lái)擴(kuò)展 ASP.NET 應(yīng)用程序生命周期。實(shí)現(xiàn) IHttpModule 接口的模塊為托管代碼模塊。ASP.NET 和 IIS 7.0 的集成管道還可以通過(guò)本機(jī)代碼模塊擴(kuò)展,這些內(nèi)容不在本主題討論范圍內(nèi)。有關(guān)本機(jī)代碼模塊以及有關(guān)通常如何配置模塊的更多信息,請(qǐng)參見(jiàn) IIS Module Overview(IIS 模塊概述)。
可以將托管代碼模塊定義為應(yīng)用程序的 App_Code 文件夾中的一個(gè)類(lèi)文件。還可以將模塊創(chuàng)建為一個(gè)類(lèi)庫(kù)項(xiàng)目,并編譯該項(xiàng)目,然后將其添加到應(yīng)用程序的 Bin 文件夾下。創(chuàng)建自定義模塊后,必須在 IIS 7.0 中注冊(cè)它。可以使用所述方法之一來(lái)管理 IIS 7.0 托管代碼模塊。例如,可以編輯應(yīng)用程序的 Web.config 文件來(lái)向該應(yīng)用程序注冊(cè)此托管代碼模塊。有關(guān)注冊(cè)模塊的示例,請(qǐng)參見(jiàn)演練:創(chuàng)建和注冊(cè)自定義 HTTP 模塊。
如果某個(gè)模塊在應(yīng)用程序的 App_Code 或 Bin 文件夾中定義,并且已在應(yīng)用程序的 Web.config 文件中注冊(cè),則此模塊僅為該應(yīng)用程序調(diào)用。若要在應(yīng)用程序的 Web.config 文件中注冊(cè)模塊,可以使用 system.webServer 節(jié)中的 modules 元素。有關(guān)更多信息,請(qǐng)參見(jiàn)如何:為 IIS 7.0 配置 <system.webServer> 節(jié)。使用 IIS 管理器或 Appcmd.exe 工具進(jìn)行更改,也將對(duì)應(yīng)用程序的 Web.config 文件進(jìn)行相應(yīng)更改。
托管代碼模塊還可以在 IIS 7.0 配置存儲(chǔ)區(qū)(ApplicationHost.config 文件)的 modules 元素中注冊(cè)。在 ApplicationHost.config 文件中注冊(cè)的模塊具有全局范圍,因?yàn)樗鼈円褳?/span> IIS 7.0 所承載的所有 Web 應(yīng)用程序注冊(cè)。同樣,在 ApplicationHost.config 文件的 globalModules 元素中定義的本機(jī)代碼模塊也具有全局范圍。如果 Web 應(yīng)用程序不需要全局模塊,則可以將其禁用。
示例
下面的示例演示一個(gè)處理 LogRequest 和 PostLogRequest 事件的自定義模塊。事件處理程序在模塊的 Init 方法中注冊(cè)。
| C#? | |
| using System; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; ? // Module that demonstrates one event handler for several events. namespace Samples { ??? public class ModuleExample : IHttpModule ??? { ??????? public ModuleExample() ??????? { ??????????? // Constructor ??????? } ??????? public void Init(HttpApplication app) ??????? { ??????????? app.LogRequest += new EventHandler(App_Handler); ??????????? app.PostLogRequest += new EventHandler(App_Handler); ??????? } ??????? public void Dispose() ??????? { ??????? } ??????? // One handler for both the LogRequest and the PostLogRequest events. ??????? public void App_Handler(object source, EventArgs e) ??????? { ??????????? HttpApplication app = (HttpApplication)source; ??????????? HttpContext context = app.Context; ? ??????????? if (context.CurrentNotification == RequestNotification.LogRequest) ??????????? { ??????????????? if (!context.IsPostNotification) ??????????????? { ??????????????????? // Put code here that is invoked when the LogRequest event is raised. ??????????????? } ?? ?????????????else ??????????????? { ??????????????????? // PostLogRequest ??????????????????? // Put code here that runs after the LogRequest event completes. ??????????????? } ??????????? } ? ??????? } ??? } } | |
下面的示例演示如何在應(yīng)用程序的 Web.config 文件中注冊(cè)模塊。在 configuration 節(jié)內(nèi)部添加 system.webServer 配置節(jié)。
| <system.webServer> ? <modules> ??? <add name="ModuleExample" type="Samples.ModuleExample"/> ? </modules> </system.webServer> | |
有關(guān)如何創(chuàng)建和注冊(cè)自定義模塊的其他示例,請(qǐng)參見(jiàn)演練:創(chuàng)建和注冊(cè)自定義 HTTP 模塊。
?
注:本文來(lái)自MSDN 2008
轉(zhuǎn)載于:https://www.cnblogs.com/zky123/archive/2009/06/06/1497868.html
總結(jié)
以上是生活随笔為你收集整理的IIS 7.0 的 ASP.NET 应用程序生命周期概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我遇到的单词
- 下一篇: IKVM 编程武林之.NET派的北冥神功