Asp.Net頁面生命週期--轉寄(學海無涯)

來源:互聯網
上載者:User

標籤:style   blog   c   ext   http   a   

一.什麼是Asp.Net頁面生命週期

當我們在瀏覽器地址欄中輸入網址,斷行符號查看頁面時,這時會向伺服器端(IIS)發送一個request請求,伺服器就會判斷髮送過來的請求頁面,  完全識別 HTTP 頁面處理常式類後,ASP.NET 運行時將調用處理常式的 ProcessRequest 方法來處理請求,來建立頁面對象。通常情況下,無需更改此方法的實現,因為它是由 Page 類提供的。接下來被建立頁面對象的ProcessRequest方法使頁面經曆了各個階段:初始化、載入檢視狀態資訊和回傳資料、載入頁面的使用者代碼以及執行回傳伺服器端事件。之後,頁面進入顯示模式:收集更新的檢視狀態,產生 HTML 程式碼並隨後將代碼發送到輸出控制台。最後,卸載頁面,並認為請求處理完畢。其中頁面對象ProcessRequest方法 完成的這一系列事件的處理過程就是Asp.Net頁面生命週期。

 

二.瞭解Asp.Net頁面生命週期的好處

瞭解個掌握ASP.NET頁面生命週期是非常必要的,這有助於我們更加靈活的控制頁面,以我們需要的方式編程開發。ASP.NET頁運行時,此頁會經曆一個又一個的事件鏈,每個事件鏈中執行不同的行為,這所有的行為共同組成我們所需要的頁面。瞭解了生命週期也更有助於我們對程式調試中發生問題的地方的定位。

三.詳解Asp.Net頁面生命週期

 

(一)先看看在開始一個頁面生命週期之前,請求的頁面經曆了那些過程。:

 

通訊處理過程:

當伺服器運行正常的情況下,用戶端(瀏覽器)
向伺服器端發送請求時,伺服器端負責監聽的通訊端(socket),監聽到有串連請求後,會為該用戶端建立一個用於通訊的通訊端與用戶端進行通訊。當使用者在瀏覽器向伺服器發送請求時,瀏覽器會按照雙方都約定好的網路傳輸層http協議,將請求轉換成符合Http協議的請求報文。然後通過裝置按照TCP協議發送到伺服器。在伺服器端接收到請求報文後。會按照Http協議對報文進行解析。若請求的內容為靜態資料,伺服器端直接將被請求的資料,按照Http協議產生響應報文後返回給瀏覽器。瀏覽器然後解析收到的報文。將頁面顯示到瀏覽器視窗。(註:最開始僅是顯示一個html 架構。經過多次請求。將CSS樣式,圖片………逐一的載入進來形成一個完整的頁面。這個過程,有多次的互動通訊。當通訊結束後會把用來通訊的通訊端銷毀,因為http協議是一種無狀態的通訊。這樣減輕了伺服器的壓力)

當瀏覽器向用戶端發送的請求為動態。那麼伺服器(IIS)發現處理不了這種尾碼名的檔案時,會通過映射表到。響應實現了介面的可擴充程式asp.net_isapi.dll, 然後asp.net_isapi.dll,又將請求轉交給網站程式處理.網站程式調用

httpRuntime類的processRequest方法來處理:

1.         此類會分析接收到的請求報文.將請求報文封裝到名稱為httpWorkerRequest的類的屬性中(便於其它地方以用).

2.         建立HttpContext對象.這個對象是當前所請求報文的上下文環境.它包含了所有的請求資料.其中有兩個最重要類的對象:http.Request和http.Response.  在httpRequest對象中又包含了兩個屬性.Form(通過表單請求的資料參數).Querystring(通過URL傳遞的資料參數); 通過索引器,可以找到參數的值. 在httpResponse 對象中有一個TextWriter對象.在它裡面儲存的是被請求的頁面在執行過程中要向瀏覽器輸出的資料.可以通過write 方法對其進行輸出給瀏覽器。

3.         通過HttpApplicationFactory類的的一個靜態方法。來為每個請求建立一個單獨的httpApplication對象。在建立之前HttpApplicationFactor會到HttpApplication池中查看,有沒有閒置。若有直接用。沒有的時候才建立新的HttpApplication。

4.         在httpApplication裡運行己轉換成介面IhttpHandler 的通過反射被請求頁面對象的ProcessRequest 方法.

方法執行過程如下:先執行httpApplication中的processRequest方法。在此方法中包含了要按照先後順序執行的19個委託事件 當在執行到第8個事件的時候就開始建立被請求頁面對象,在執行到第11和第12個事件之間時。就執行被建立的請求頁面對象的ProcessRequest方法。

 

 

(二)開始頁面生命週期

1.頁面生命週期的主要階段包括: 階段 事件/方法   
頁面初始化          Page_Init  
載入View State      LoadViewState   
回傳資料處理      LoadPostData   
頁面載入          Page_Load   
回傳通知          RaisePostDataChangedEvent  
回傳事件處理     RaisePostBackEvent  
頁面預渲染       Page_PreRender   
儲存             viewstate SaveViewState   
Page渲染         Page_Render   
Page 卸載       Page_UnLoad  

2.頁面生命週期的主要事件:

PreInit:

1.檢查IsPostBack 屬性

2.動態設定Master Page

3.動態設定Theme

4.設定控制項的預設值(UniqueId等)

5.重新建立動態控制項(初始化控制項),初始化控制項的值

Init: 這個事件發生在所有的控制項被初始化,所有的皮膚設定被應用以後。它用來讀取或者初始化控制項屬性。它能夠用來註冊一些aspx頁面中沒有指出的控制項的事件。

InitComplete: Use this event for processing tasks that require all initialization to be complete.

PreLoad: 載入頁面的ViewState和所有的控制項,然後處理所有的包含在Request執行個體中的postback資料。

Load: 這個事件可能是大家最熟悉的了。需要注意的是,Page對象會遞迴的調用子控制項的onload事件直到頁面和所有的子控制項被載入完成。這個事件主要用來設定控制項屬性的值,建立資料庫連接(通常不這麼做)。

Validation: 如果你的控制項要求驗證,驗證會在這個階段發生,這個時候你可以檢查控制項的IsValid屬性。跟這個階段關聯的事件是Validate,它有一個可以接受驗證字串群的重載方法(overload method),這個重載方法執行特定控制項群的驗證。

Control events: 這個就不多說了,主要是處理控制項的事件,例如click。這也就讓我們明白了每次我們click一個Button的時候,實際上是要先去執行load事件然後才執行click事件的,一般我們用!IsPostBack來判斷一下從而避免執行不必要的載入邏輯。

LoadComplete: 頁面所有的控制項都被載入以後執行,暫時沒有想到用來幹什麼。。。

PreRender: 在HTML被產生之前這是最後一個事件。每一個頁面中的控制項都有PreRender的過程。在這裡對將要輸出的HTML結果進行最後一次修改。

SaveStateComplete: 在這個時間發生之前,已經儲存了所有控制項和頁面的,任何對page或者控制項的改動都不會產生左右。暫時沒想到用來幹啥。

Render: 它不是一個事件而是一個方法。工作就是把HTML寫回用戶端瀏覽器。

UnLoad: 頁面中的每一個控制項都會發生這件事。在控制項中,使用這個事件來做清理工作,例如關閉資料庫連接等。對與頁面本身也是做清理工作,例如關閉開啟的檔案和資料庫連接,或者結束日誌或者其它指定的工作。

需要說明的是,每次Request都會建立一個全新的Page類的執行個體,所以在頁面中的自己定義的欄位是不能在兩次request中傳遞值的,需要使用viewstate來儲存。

頁面處理的整體過程圖解

 

四.什麼地方用到了Asp.Net 頁面生命週期

   對於這個問題,在面試中我遇到過,我覺得問這個問題有點不正常。我當時回答的是。Viewstate 對值的記錄上用到了生命週期,總是覺對不太對。

生命週期理解了,並不代表我們會用它。只有理解了,我們才會在以後的工作中慢慢真正的懂它,用它。

總結:計划了好久,一直沒有寫,今天下定決心一定要寫了。終於完成了。我看有一位博友的用三張圖片詳解Asp.Net 全生命週期還不錯。用圖結構清晰,更便於理解。故貼到下面便於博友們和以後自己的查看。原文地址:http://www.cnblogs.com/zhaoyang/archive/2011/11/16/2251200.html

說明:

1  第一張圖片從全域說明從用戶端發出一個Request請求,伺服器windows核心中的HTTP.SYS組件接收該請求開始到IIS處理完該請求並響應到用戶端結束。

2  第二張圖片為圖1中Http處理管線的詳細步驟

3  第三張圖片為圖2Http處理管線中調用處理常式(HttpHandler,  此處為Page對象)的詳細生命週期過程。

圖1:

 

圖2.

 

圖3.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.