資訊: 應用程式執行個體、 應用程式事件及在 ASP.NET 應用程式狀態

文章翻譯 文章翻譯
文章編號: 312607 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

ASP.NET HttpApplication 物件隱藏許多複雜的概念,以簡化程式設計模型。本文將告訴您一些這些複雜情況。在另外本文將告訴您如何 ASP.NET 處理傳統的 Microsoft 動態伺服器網頁 (ASP) 應用程式 物件的相容性問題。

本文分為下列各節:

其他相關資訊

應用程式類別和應用程式執行個體

應用程式類別是在 Global.asax 檔中定義的。在 Global.asax 中的程式碼定義衍生自 System.Web.HttpApplication 的新類別。如果沒有使用 Global.asax 檔案,基底類別 HttpApplication,當做應用程式類別使用。

ASP.NET 執行階段會建立多個類別執行個體的應用程式視需要同時處理要求。對於大部分應用程式這個數目受限於執行緒的數目,而會維持在 1 到取決於硬體、 伺服器負載、 組態及等等的 100 的範圍。許多要求重複使用應用程式執行個體及應用程式執行個體的可用清單保留期間的降低負載。應用程式執行個體是以安全執行緒方式使用,也就是一個要求一次。這有重大的影響:
  • 您不必擔心鎖定當您存取的應用程式類別的非靜態成員。
  • 應用程式的程式碼可以將每個要求的要求資料儲存在應用程式類別的非靜態成員 (但 EndRequest 事件後不因為此事件可能會維護要求一段很長的時間)。
因為靜態成員包括一個應用程式] 類別的任何類別不是安全執行緒,使用者程式碼必須提供適當的鎖定,用來存取靜態成員。這適用於您將加入至應用程式類別的任何靜態成員。

使用下列方針來存取與目前要求相關聯的應用程式執行個體:
  • 從 [Global.asax 使用 的物件。
  • 從一個頁面每一頁會包含強型別 ApplicationInstance 屬性。
  • HttpContext object 使用 HttpContext.ApplicationInstance 屬性 (這您鍵入作為 HttpApplication)。
附註因為 應用程式 參考到全域應用程式狀態字典中典型的 ASP,ASP.NET 使用 ApplicationInstance應用程式 做為屬性名稱來參考處理目前要求的應用程式執行個體。

應用程式事件

要求的存留期 (Lifetime) 是由一系列的應用程式事件 (和 ASP.NET 實作一些隱含步驟) 所組成。以下列出這些事件會執行的順序:
  1. BeginRequest
  2. AuthenticateRequest 事件
  3. DefaultAuthentication 內部事件
  4. AuthorizeRequest 事件
  5. ResolveRequestCache 事件
  6. 內部的步驟,以"對應處理常式 」 (當編譯發生一頁會建立執行個體)
  7. AcquireRequestState 事件
  8. PreRequestHandlerExecute 事件
  9. 內部 「 執行處理常式 」 的步驟 (當執行網頁程式碼)
  10. PostRequestHandlerExecute 事件
  11. ReleaseRequestState 事件
  12. 內部的步驟,以篩選回應 UpdateRequestCache 事件
  13. UpdateRequestCache 事件
  14. EndRequest 事件
附註如果您使用 Server.TransferResponse.Redirect(string),有效地中斷目前的要求,且某些上面列出的事件將不會引發。不過,在這種情況下,就會引發 EndRequest 事件。

下列項目可以處理這些事件:
  • 內部 ASP.NET 網頁架構 (比方說步驟 6、 9 和上述清單中的 12)。
  • 為應用程式設定的 HTTP 模組。HTTP 模組的預設清單是在 Machine.config 檔中定義。
  • 在 Global.asax,透過 [啟動] EventName Application_ 方法攔截或,會攔截明確當您新增一個替代的處理常式名稱的事件處理常式中撰寫程式碼。
每個事件可以有同步和非同步訂閱者。 非同步訂閱者會先執行。永遠執行並非所有的事件 ; 唯一永遠執行的事件是 EndRequest。如此一來執行所有的 after-request 清除 EndRequest 事件中。

附註在大多數情況下實際回應是傳送至用戶端應用程式執行個體完成與回應 (也就是在 EndRequest 之後) 之後。

Application_OnStart 和 Application_OnEnd

ASP.NET 會介紹,唯一 Application_OnStartApplication_OnEnd 「 事件 」 與典型的 ASP 的相容性。這些 「 事件 」 在存留期的應用程式,而不是每個應用程式執行個體中執行的一次。因此,如果您變更這些方法中的非靜態成員,您會影響只有一個應用程式執行個體和不是所有執行個體。您可以初始化一個應用程式執行個體在建構函式,或是藉由覆寫 初始化 方法。

Application_OnStart 與應用程式] 類別的類別建構函式邏輯相等的動作,但它提供了一個優點: 在程式碼可存取 HttpContext 第一次要求應用程式。

應用程式狀態

應用程式狀態是全域的字典的典型的 ASP 引進彌補 Microsoft Visual Basic 指令碼版 (VBScript) 中的全域變數不存在的晚期繫結物件。在 ASP.NET 中,您可以透過下列其中一項存取應用程式狀態:
  • 應用程式 屬性 (它在 HttpApplicationPage 類別中定義)
  • HttpContext.Application
ASP.NET 包含主要目的是為了與典型的 ASP 相容性的應用程式狀態,讓它更容易地遷移至 ASP.NET 的現有應用程式。建議您將資料儲存在應用程式類別而不是 應用程式 物件中的靜態成員。這會增加效能,因為您可以存取應用程式中的項目快存取靜態變數字典。

若要存取靜態應用程式成員從 Microsoft Visual C#.NET 和 Microsoft Visual Basic.NET 中的網頁,您必須使用在 Global.asax 中的 ClassName] 屬性來命名您的應用程式類別為範例:
<%@ Application Language="C# | VB" ClassName="MyClass" %>
				
如果靜態成員被命名為 MyStaticMember Global.asax 檔中,您可以使用 MyClass.MyStaticMember 來存取從您的網頁。

屬性

文章編號: 312607 - 上次校閱: 2004年1月21日 - 版次: 5.3
這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
關鍵字:?
kbmt kbappdev kbhttpruntime kbinfo kbstate KB312607 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:312607
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com