共用方式為


IIS 7.0 的 ASP.NET 應用程式生命週期概觀

更新:2007 年 11 月

本主題說明在 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 整合管線是統一的要求處理管線,支援機器碼以及 Managed 程式碼模組。實作 IHttpModule 介面的 Managed 程式碼模組,具有要求管線中所有事件的存取權。例如,Managed 程式碼模組可用於 ASP.NET 網頁 (.aspx 檔案) 和 HTML 頁面 (.htm 或 .html 檔案) 的 ASP.NET 表單驗證。即使 IIS 和 ASP.NET 將 HTML 頁面視為靜態資源,也可以進行表單驗證。如需 IIS 7.0 整合模式的詳細資訊,請參閱 ASP.NET 與 IIS7 整合 (英文)。

此主題包括下列章節:

  • 架構概觀

  • 生命週期階段

  • 使用 Global.asax 檔案

  • IIS 7.0 中的 Managed 程式碼模組

架構概觀

IIS 7.0 整合模式中的要求所經過的階段,就像 IIS 6.0 中的 ASP.NET 資源之要求的階段一樣。但是,在 IIS 7.0 中,這些階段包括幾項其他應用程式事件,例如 MapRequestHandlerLogRequestPostLogRequest 事件。

IIS 7.0 和 IIS 6.0 的處理階段之間的主要差異,在於 ASP.NET 如何與 IIS 伺服器整合。在 IIS 6.0 中,有兩個要求處理管線。一條管線供機器碼 ISAPI 篩選常式 (Filter) 以及擴充元件。另一條管線供 Managed 程式碼應用程式元件 (例如 ASP.NET) 使用。在 IIS 7.0 中,ASP.NET 執行階段會與 Web 伺服器整合,因此會產生統一的要求處理管線以供所有要求使用。對 ASP.NET 開發人員來說,整合管線的好處如下:

  • 整合管線會引發 HttpApplication 物件所公開的所有事件,使現有的 ASP.NET HTTP 模組能在 IIS 7.0 整合模式下運作。

  • 機器碼和 Managed 程式碼模組都可以在 Web 伺服器、網站或 Web 應用程式層級設定。包括工作階段狀態、表單驗證、設定檔以及角色管理的內建 ASP.NET Managed 程式碼模組。此外,不論是否針對 ASP.NET 資源 (例如 .aspx 檔案) 進行要求,都可以對所有要求啟用或停用 Managed 程式碼模組。

  • 管線中的任何階段都可以叫用 Managed 程式碼模組。包括對要求進行任何伺服器處理之前,以及所有伺服器處理完成後,或是開始處理到完成前的任何時間。

  • 您可以透過應用程式的 Web.config 檔案,登錄和啟用或停用模組。

下圖顯示應用程式的要求管線之組態。範例包括如下:

  • Anonymous 機器碼模組和 Forms Managed 程式碼模組 (對應於 FormsAuthenticationModule)。這些模組經過設定,會在要求的 Authentication 階段加以叫用。

  • Basic 機器碼模組和 Windows Managed 程式碼模組 (對應於 WindowsAuthenticationModule)。這些模組會顯示,但不會為應用程式設定。

  • Execute handler 階段,會叫用處理常式 (屬於 URL 範圍的模組) 以建構回應。如果是 .aspx 檔案,則 PageHandlerFactory 處理常式會用於回應要求。對於靜態檔案,則機器碼 StaticFileModule 模組會回應要求。

  • Trace 機器碼模組。此模組會顯示,但不會為應用程式設定。

  • Custom module Managed 程式碼類別。這是在 Log request 階段時叫用。

如需從舊版 IIS 移轉至 IIS 7.0 的 ASP.NET 應用程式時已知的相容性問題,請參閱將 ASP.NET 應用程式升級到 IIS 7.0:IIS 7.0 整合模式與傳統模式的差異中的<整合模式與傳統模式間的已知差異>一節 (英文)。

生命週期階段

下表列出 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 列舉型別 (Enumeration) 所代表。所有要求都可以設定為可利用 ASP.NET 功能,因為此功能已封裝在具有要求管線存取權限的 Managed 程式碼模組中。例如,即使 .htm 副檔名沒有明確對應至 ASP.NET,HTML 頁面要求還是會叫用 ASP.NET 模組。如此您就可以對所有資源利用 ASP.NET 驗證及授權。

統一的管線會接收應用程式的第一個要求。

當統一管線接收應用程式中任何資源的第一個要求時,就會建立 ApplicationManager 類別的執行個體,要求就是在這個應用程式定義域中處理的。應用程式定義域會隔離應用程式間的全域變數,而且能夠允許每個應用程式個別進行卸載。在應用程式定義域中,會建立 HostingEnvironment 類別的執行個體,以提供應用程式相關資訊 (例如儲存應用程式的資料夾名稱) 的存取權。

在第一個要求期間,會視需要編譯應用程式的最上層項目,其中包括 App_Code 資料夾中的應用程式程式碼。您可以按照本主題稍後的 IIS 7.0 中的 Managed 程式碼模組中的描述,以包含 App_Code 資料夾中的自訂模組和處理常式。

為每一個要求建立回應物件。

建立應用程式定義域和 HostingEnvironment 物件執行個體化後,就會建立和初始化應用程式物件,例如 HttpContextHttpRequestHttpResponseHttpContext 類別包含目前應用程式要求的特定物件,例如 HttpRequestHttpResponse 物件。HttpRequest 物件內含目前要求的相關資訊,包括 Cookie 和瀏覽器資訊。HttpResponse 物件包含傳送至用戶端的回應,包括所有呈現的輸出和 Cookie。

下列是在 IIS 6.0 和 IIS 7.0 中以整合模式執行,並搭配 .NET Framework 3.0 (含) 以後版本之間的主要差異:

HttpApplication 物件會指派給要求。

在初始化所有應用程式物件後,會藉由建立 HttpApplication 類別的執行個體來啟動應用程式。如果應用程式有 Global.asax 檔案,則 ASP.NET 會建立 Global.asax 類別的執行個體 (此類別衍生自 HttpApplication 類別)。然後使用衍生的類別來代表此應用程式。

注意事項:
當第一次在應用程式中要求 ASP.NET 頁面或處理序時,會建立 HttpApplication 類別的新執行個體。然而,若要讓效能最佳化,多重處理序可能會重複使用 HttpApplication 執行個體。

載入哪些 ASP.NET 模組 (例如 SessionStateModule),必須視應用程式繼承自父應用程式的 Managed 程式碼模組而定。以及應用程式的 Web.config 檔案中的組態區段中設定了哪些模組而定。在應用程式 system.webServer 區段中的 Web.config modules 項目中,會加入或移除模組。如需詳細資訊,請參閱HOW TO:設定 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.0StaticFileModule) 或 Managed 程式碼模組 (例如 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 (含) 以後版本時,才支援 MapRequestHandlerLogRequestPostLogRequest 事件。

使用 Global.asax 檔案

Global.asax 檔案是在 IIS 7.0 中以整合模式執行,就如同在 IIS 6.0 的 ASP.NET 中使用一樣。如需詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀中的「生命週期事件與 Global.asax 檔案」一節。

其中一個差別在於,您可以加入 MapRequestHandlerLogRequestPostLogRequest 事件的處理常式。在 IIS 7.0 中以整合模式執行且搭配 .NET Framework 3.0 (含) 以後版本的應用程式,可支援這些事件。

您可以在 Global.asax 檔案中提供應用程式事件處理常式,以加入程式碼來執行 ASP.NET 處理的所有要求,例如 .aspx 頁面和 .axd 頁面的要求。但是,不會為非 ASP.NET 資源 (例如靜態檔案) 的要求呼叫 Global.asax 檔案中的處理常式程式碼。若要執行所有資源都會執行的 Managed 程式碼,請建立一個會實作 IHttpModule 介面的自訂模組。即使資源處理常式不是 ASP.NET 處理常式,自訂模組還是會為應用程式中的所有資源要求執行。

IIS 7.0 中的 Managed 程式碼模組

可在 IIS 7.0 中設定和載入的 ASP.NET Managed 程式碼模組如下:

若要設定 IIS 7.0 Managed 程式碼模組,您可以使用下列其中一種方法:

當 ASP.NET Managed 程式碼模組 (例如 FormsAuthenticationModule 模組) 設定為在 IIS 7.0 中載入,則此模組就會有要求管線中所有事件的存取權。表示所有要求都會通過 Managed 程式碼模組。對 FormsAuthenticationModule 類別而言,這代表可以使用表單驗證加以保護靜態內容,即使內容不是由 ASP.NET 處理常式所處理。

開發自訂 Managed 程式碼模組

使用實作 IHttpModule 介面的模組,可延長 ASP.NET 應用程式生命週期。實作 IHttpModule 介面的模組是 Managed 程式碼模組。ASP.NET 和 IIS 7.0 的整合管線也可以透過機器碼模組延伸,但本主題中並未討論這部分。如需機器碼模組的詳細資訊,以及如何進行模組的一般設定,請參閱 IIS 模組概觀 (英文)。

您可以將 Managed 程式碼模組定義成應用程式 App_Code 資料夾中的類別檔。您也可以將模組建立成類別庫專案、編譯專案,然後將它加入至應用程式的 Bin 資料夾中。在建立了自訂模組後,必須向 IIS 7.0 登錄它。您可以使用管理 IIS 7.0 Managed 程式碼模組所述的其中一個方法。例如,您可以編輯應用程式的 Web.config 檔案,以便僅登錄該應用程式的 Managed 程式碼模組。如需登錄模組的範例,請參閱逐步解說:建立和註冊自訂 HTTP 模組

如果模組定義在應用程式的 App_Code 或 Bin 資料夾中,而且在應用程式的 Web.config 檔案中登錄它,則只會為該應用程式叫用模組。若要在應用程式的 Web.config 檔案中登錄模組,您要在system.webServer 區段中使用 modules 項目。如需詳細資訊,請參閱HOW TO:設定 IIS 7.0 的 <system.webServer> 區段。使用 IIS 管理員或 Appcmd.exe 工具所做的變更,會變更應用程式的 Web.config 檔案。 

Managed 程式碼模組也可以登錄在 IIS 7.0 設定存放區 (ApplicationHost.config 檔案) 的 modules 項目中。ApplicationHost.config 檔案中所登錄的模組具有全域範圍,因為這些模組是為 IIS 7.0 裝載的所有 Web 應用程式所登錄。同樣地,ApplicationHost.config 檔案的 globalModules 項目中所定義的機器碼模組也有全域範圍。如果 Web 應用程式不需要全域模組,您可以停用它。

範例

下列範例示範會處理 LogRequestPostLogRequest 事件的自訂模組。事件處理常式會登錄在模組的 Init 方法中。

Imports System
Imports System.Data
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports Microsoft.VisualBasic

' Module that demonstrates one event handler for several events.
Namespace Samples

    Public Class ModuleExample
        Implements IHttpModule

        Public Sub New()
            ' Constructor
        End Sub

        Public Sub Init(ByVal app As HttpApplication) Implements IHttpModule.Init
            AddHandler app.LogRequest, AddressOf Me.App_Handler
            AddHandler app.PostLogRequest, AddressOf Me.App_Handler
        End Sub

        Public Sub Dispose() Implements IHttpModule.Dispose
        End Sub

        ' One for both the LogRequest and PostLogRequest events.
        Public Sub App_Handler(ByVal source As Object, ByVal e As EventArgs)
            Dim app As HttpApplication = CType(source, HttpApplication)
            Dim context As HttpContext = app.Context

            If (context.CurrentNotification = RequestNotification.LogRequest) Then

                If Not (context.IsPostNotification) Then

                    ' Put code here that is invoked when the LogRequest event is raised.

                Else
                    ' PostLogRequest
                    ' Put code here that runs after the LogRequest event completes.

                End If
            End If
        End Sub
    End Class

End Namespace
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 檔案中登錄模組。將 system.webServer 組態區段加入至組態區段。

<system.webServer>
  <modules>
    <add name="ModuleExample" type="Samples.ModuleExample"/>
  </modules>
</system.webServer>

如需示範如何建立和登錄自訂模組的其他範例,請參閱逐步解說:建立和註冊自訂 HTTP 模組

請參閱

概念

ASP.NET 網頁存留週期概觀

ASP.NET 概觀

ASP.NET 編譯概觀

其他資源

ASP.NET 和 IIS 組態