日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

IIS 7.0 的 ASP.NET 应用程序生命周期概述

發布時間:2023/12/4 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IIS 7.0 的 ASP.NET 应用程序生命周期概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本主題介紹在 IIS 7.0 集成模式下運行以及與 .NET Framework 3.0 或更高版本一起運行的 ASP.NET 應用程序的應用程序生命周期。IIS 7.0 還支持經典模式,其行為類似于在 IIS?6.0 中運行的 ASP.NET。有關更多信息,請參見 IIS 5.0 6.0 ASP.NET 應用程序生命周期概述

IIS 7.0 集成管道是一種統一的請求處理管道,它同時支持本機代碼和托管代碼模塊。實現 IHttpModule 接口的托管代碼模塊可訪問該請求管道中的所有事件。例如,托管代碼模塊可用于 ASP.NET 網頁(.aspx 文件)和 HTML 頁(.htm .html 文件)的 ASP.NET Forms 身份驗證。即使 IIS ASP.NET HTML 頁視為靜態資源,情況也是如此。有關 IIS 7.0 集成模式的更多信息,請參見 ASP.NET Integration with IIS7(將 ASP.NET IIS7 集成)。

本主題包含以下幾節:

·???????? 結構概述

·???????? 生命周期階段

·???????? 使用 Global.asax 文件

·???????? IIS?7.0 中的托管代碼模塊

結構概述

IIS 7.0 集成模式下的請求會經歷幾個階段,類似于在 IIS?6.0 中對 ASP.NET 資源的請求所經歷的階段。但是,在 IIS 7.0 中,這些階段包含多個額外的應用程序事件,如 MapRequestHandlerLogRequest PostLogRequest 事件。

IIS 7.0 IIS?6.0 的處理階段之間的主要區別在于 ASP.NET 如何與 IIS 服務器集成。在 IIS?6.0 中,有兩個請求處理管道。一個管道用于本機代碼 ISAPI 篩選器和擴展組件。另一個管道用于托管代碼應用程序組件,如 ASP.NET。在 IIS 7.0 中,ASP.NET 運行庫與 Web 服務器集成,這樣就有了一個針對所有請求的統一的請求處理管道。對于 ASP.NET 開發人員,集成管道有以下益處:

集成管道引發由 HttpApplication 對象公開的所有事件,這使現有 ASP.NET HTTP 模塊可在 IIS 7.0 集成模式下工作。

Web 服務器級別、網站級別或 Web 應用程序級別,都可配置本機代碼和托管代碼模塊。這包括用于會話狀態、Forms 身份驗證、配置文件以及角色管理的內置 ASP.NET 托管代碼模塊。此外,可以為所有請求啟用或禁用托管代碼模塊,無論請求是否針對 ASP.NET 資源(如 aspx 文件)。

可以在管道中的任何階段調用托管代碼模塊。這包括在對請求進行任何服務器處理之前,在所有服務器處理都已發生之后,或者兩者間的任何階段。

可以通過應用程序的 Web.config 文件注冊模塊,也可以啟用或禁用模塊。

面的插圖演示應用程序的請求管道的配置。該示例包括以下內容:

·???????? Anonymous 本機代碼模塊和 Forms 托管代碼模塊(對應于 [T:System.Web.Security.FormsAuthenticationModule)])。這些模塊都已配置,并在請求的Authentication階段調用。

·???????? Basic 本機代碼模塊和 Windows 托管代碼模塊(對應于 WindowsAuthenticationModule)。它們雖然顯示,但并沒有為應用程序進行配置。

·???????? Execute handler 階段,會調用處理程序(應用范圍為 URL 的模塊)以構造響應。對于 .aspx 文件,使用 PageHandlerFactory 處理程序來響應請求。對于靜態文件,本機代碼 StaticFileModule 模塊響應請求。

·???????? Trace 本機代碼模塊。此模塊雖然顯示,但并沒有為應用程序進行配置。

·???????? Custom module 托管代碼類。該類在 Log request 階段中調用。

有關從早期版本的 IIS 遷移到 IIS 7.0 ASP.NET 應用程序的已知兼容性問題的信息,請參見 Upgrading ASP.NET Applications to IIS 7.0: Differences between IIS 7.0 Integrated Mode and Classic mode(將 ASP.NET 應用程序升級到 IIS 7.0IIS 7.0 集成模式和經典模式之間的區別)中的“Known Differences Between Integrated Mode and Classic Mode”(集成模式和經典模式之間的已知區別)部分。

生命周期階段

下表列出了在 IIS 7.0 集成模式下運行的 ASP.NET 應用程序生命周期的各個階段。

階段

說明

發出一個對應用程序資源的請求。

ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器發送請求為起點。

IIS 7.0 經典模式下以及在 IIS?6.0 中,ASP.NET 請求管道與 Web 服務器管道分離。模塊僅應用于路由到 ASP.NET ISAPI 擴展的請求。如果請求的資源類型的文件擴展名未顯式映射到 ASP.NET,則不會為該請求調用 ASP.NET 功能,因為 ASP.NET 運行庫沒有處理該請求。

而在 IIS 7.0 集成模式下,由一個統一的管道處理所有請求。當集成管道收到請求時,該請求將經歷所有請求共有的一些階段。這些階段由 RequestNotification 枚舉表示。所有請求都可以配置為使用 ASP.NET 功能,因為該功能封裝在可以訪問請求管道的托管代碼模塊中。例如,即使 .htm 文件擴展名未顯式映射到 ASP.NET,對 HTML 頁的請求仍會調用 ASP.NET 模塊。這使您能對所有資源使用 ASP.NET 身份驗證和授權。

統一管道接收對應用程序的第一個請求。

當統一管道接收對應用程序中的任何資源的第一個請求時,將為 ApplicationManager 類創建一個實例,該實例就是處理請求的應用程序域。應用程序域提供了應用程序之間全局變量的分離,并且使每個應用程序能夠單獨卸載。在應用程序域中,將為 HostingEnvironment 類創建一個實例,該實例提供對有關應用程序的信息(如存儲該應用程序的文件夾的名稱)的訪問。

在第一個請求期間,如果需要,將對應用程序中的頂級項進行編譯,其中包括 App_Code 文件夾中的應用程序代碼。可以根據本主題后面的 IIS?7.0 中的托管代碼模塊中的說明,在 App_Code 文件夾中包含自定義模塊和處理程序。

將為每個請求創建響應對象。

在創建了應用程序域并對 HostingEnvironment 對象進行了實例化之后,將創建并初始化應用程序對象,如 HttpContextHttpRequest HttpResponseHttpContext 類包含特定于當前應用程序請求的對象,如 HttpRequest HttpResponse 對象。HttpRequest 對象包含有關當前請求的信息,包括 Cookie 和瀏覽器信息。HttpResponse 對象包含發送到客戶端的響應,其中包括所有呈現的輸出和 Cookie

下面是 IIS?6.0 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 屬性提供對響應的響應頭的訪問。

·???????? 在一個事件處理程序處理多個 HttpApplication 事件時,可以使用 HttpContext 對象的兩個屬性 IsPostNotification CurrentNotification

·???????? HttpRequest 對象的 Headers ServerVariables 屬性支持寫操作。

HttpApplication 對象分配給請求

初始化所有應用程序對象之后,將通過創建 HttpApplication 類的實例來啟動應用程序。如果應用程序有 Global.asax 文件,則 ASP.NET 會創建從 HttpApplication 類派生的 Global.aspx 類的實例。然后使用該派生類來表示應用程序。

注意:

第一次在應用程序中請求 ASP.NET 頁或進程時,將創建 HttpApplication 類的一個新實例。不過,為了盡可能提高性能,可對多個請求重復使用 HttpApplication 實例。

加載哪些 ASP.NET 模塊(如 SessionStateModule)取決于應用程序從父應用程序繼承的托管代碼模塊。這還取決于在應用程序的 Web.config 文件的配置節中配置了哪些模塊。在應用程序的 Web.config system.webServer 節中的 modules 元素中添加或移除模塊。有關更多信息,請參見如何:為 IIS 7.0 配置 <system.webServer>

HttpApplication 管線處理請求。

在處理請求時,HttpApplication 類會執行下列任務。這些事件對于希望在引發關鍵請求管道事件時運行代碼的網頁開發人員很有用。如果是在開發自定義模塊,并且希望對發往管道的所有請求都調用該模塊,則這些事件也很有用。自定義模塊實現 IHttpModule 接口。在 IIS 7.0 集成模式下,必須在模塊的 Init 方法中注冊事件處理程序。

1.??? 對請求進行驗證,將檢查瀏覽器發送的信息,并確定其是否包含潛在惡意標記。有關更多信息,請參見 ValidateRequest 腳本侵入概述

2.??? 如果已在 Web.config 文件的 UrlMappingsSection 節中配置了任何 URL,則執行 URL 映射。

3.??? 引發 BeginRequest 事件。

4.??? 引發 AuthenticateRequest 事件。

5.??? 引發 PostAuthenticateRequest 事件。

6.??? 引發 AuthorizeRequest 事件。

7.??? 引發 PostAuthorizeRequest 事件。

8.??? 引發 ResolveRequestCache 事件。

9.??? 引發 PostResolveRequestCache 事件。

10.? 引發 MapRequestHandler 事件。將根據所請求資源的文件擴展名,選擇相應的處理程序。處理程序可以是本機代碼模塊,如 IIS 7.0 StaticFileModule,也可以是托管代碼模塊,如 PageHandlerFactory 類(它處理 .aspx 文件)。

11.? 引發 PostMapRequestHandler 事件。

12.? 引發 AcquireRequestState 事件。

13.? 引發 PostAcquireRequestState 事件。

14.? 引發 PreRequestHandlerExecute 事件。

15.? 為該請求調用合適的 IHttpHandler 類的 ProcessRequest 方法(或異步版 IHttpAsyncHandler..::.BeginProcessRequest)。例如,如果該請求針對某頁,則當前的頁實例將處理該請求。

16.? 引發 PostRequestHandlerExecute 事件。

17.? 引發 ReleaseRequestState 事件。

18.? 引發 PostReleaseRequestState 事件。

19.? 如果定義了 Filter 屬性,則執行響應篩選。

20.? 引發 UpdateRequestCache 事件。

21.? 引發 PostUpdateRequestCache 事件。

22.? 引發 LogRequest 事件。

23.? 引發 PostLogRequest 事件。

24.? 引發 EndRequest 事件。

25.? 引發 PreSendRequestHeaders 事件。

26.? 引發 PreSendRequestContent 事件。

注意:

只有當應用程序在 IIS 7.0 集成模式下運行,并且與 .NET Framework 3.0 或更高版本一起運行時,才會支持 MapRequestHandlerLogRequest PostLogRequest 事件。

使用 Global.asax 文件

IIS 7.0 集成模式下使用 Global.asax 文件與在 IIS 6.0 ASP.NET 中使用該文件非常相似。有關更多信息,請參見 IIS 5.0 6.0 ASP.NET 應用程序生命周期概述中的生命周期事件和 Global.asax 文件一節。

其中一個區別是:您可以為 MapRequestHandlerLogRequest PostLogRequest 事件添加處理程序。對于在 IIS 7.0 集成模式下運行并且與 .NET Framework 3.0 或更高版本一起運行的應用程序,可以支持這些事件。

可以在 Global.asax 文件中提供應用程序事件處理程序,以添加為 ASP.NET 處理的所有請求(例如對 .aspx .axd 頁的請求)執行的代碼。但是,不會調用 Global.asax 文件中的處理程序代碼來處理對非 ASP.NET 資源(如靜態文件)的請求。若要運行為所有資源運行的托管代碼,請創建一個實現 IHttpModule 接口的自定義模塊。該自定義模塊將會運行,以處理對應用程序中的資源的所有請求,即使資源處理程序不是 ASP.NET 處理程序。

IIS?7.0 中的托管代碼模塊

可在 IIS 7.0 中配置并加載的 ASP.NET 托管代碼模塊包括下面這些:

·???????? FormsAuthenticationModule

·???????? ProfileModule

·???????? RoleManagerModule

·???????? SessionStateModule

若要配置 IIS 7.0 托管代碼模塊,可以使用以下方法之一:

·???????? 使用 IIS 管理器。有關更多信息,請參見如何:打開 IIS 管理器

·???????? 使用 IIS 7.0 命令行工具 (Appcmd.exe)。有關更多信息,請參見 IIS 7.0 Command-Line ToolIIS 7.0 命令行工具)。

·???????? 編輯 IIS 7.0 基于 XML 的配置存儲區。有關更多信息,請參見 IIS 7.0: IIS 7.0 Configuration StoreIIS 7.0IIS 7.0 配置存儲區)。

ASP.NET 托管代碼模塊(如 FormsAuthenticationModule 模塊)配置為在 IIS 7.0 中加載時,它可以訪問請求管道中的所有事件。這意味著所有請求都將通過該托管代碼模塊。對于 FormsAuthenticationModule 類,這意味著可以使用 Forms 身份驗證來保護靜態內容,即使這些內容并非由 ASP.NET 處理程序進行處理。

開發自定義托管代碼模塊

可使用實現 IHttpModule 接口的模塊來擴展 ASP.NET 應用程序生命周期。實現 IHttpModule 接口的模塊為托管代碼模塊。ASP.NET IIS 7.0 的集成管道還可以通過本機代碼模塊擴展,這些內容不在本主題討論范圍內。有關本機代碼模塊以及有關通常如何配置模塊的更多信息,請參見 IIS Module OverviewIIS 模塊概述)。

可以將托管代碼模塊定義為應用程序的 App_Code 文件夾中的一個類文件。還可以將模塊創建為一個類庫項目,并編譯該項目,然后將其添加到應用程序的 Bin 文件夾下。創建自定義模塊后,必須在 IIS 7.0 中注冊它。可以使用所述方法之一來管理 IIS 7.0 托管代碼模塊。例如,可以編輯應用程序的 Web.config 文件來向該應用程序注冊此托管代碼模塊。有關注冊模塊的示例,請參見演練:創建和注冊自定義 HTTP 模塊

如果某個模塊在應用程序的 App_Code Bin 文件夾中定義,并且已在應用程序的 Web.config 文件中注冊,則此模塊僅為該應用程序調用。若要在應用程序的 Web.config 文件中注冊模塊,可以使用 system.webServer 節中的 modules 元素。有關更多信息,請參見如何:為 IIS 7.0 配置 <system.webServer> 。使用 IIS 管理器或 Appcmd.exe 工具進行更改,也將對應用程序的 Web.config 文件進行相應更改。

托管代碼模塊還可以在 IIS 7.0 配置存儲區(ApplicationHost.config 文件)的 modules 元素中注冊。在 ApplicationHost.config 文件中注冊的模塊具有全局范圍,因為它們已為 IIS 7.0 所承載的所有 Web 應用程序注冊。同樣,在 ApplicationHost.config 文件的 globalModules 元素中定義的本機代碼模塊也具有全局范圍。如果 Web 應用程序不需要全局模塊,則可以將其禁用。

示例

下面的示例演示一個處理 LogRequest PostLogRequest 事件的自定義模塊。事件處理程序在模塊的 Init 方法中注冊。

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.

??????????????? }

??????????? }

?

??????? }

??? }

}

下面的示例演示如何在應用程序的 Web.config 文件中注冊模塊。在 configuration 節內部添加 system.webServer 配置節。

<system.webServer>

? <modules>

??? <add name="ModuleExample" type="Samples.ModuleExample"/>

? </modules>

</system.webServer>

有關如何創建和注冊自定義模塊的其他示例,請參見演練:創建和注冊自定義 HTTP 模塊

?

注:本文來自MSDN 2008

轉載于:https://www.cnblogs.com/zky123/archive/2009/06/06/1497868.html

總結

以上是生活随笔為你收集整理的IIS 7.0 的 ASP.NET 应用程序生命周期概述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。