什麼是Asp.Net頁面生命周期 當我們在瀏覽器地址欄中輸入網址,回車查看頁面時,這時會向伺服器端(IIS)發送一個request請求,伺服器就會判斷發送過來的請求頁面, 完全識別 HTTP 頁面處理程式類後,ASP.NET 運行時將調用處理程式的 ProcessRequest 方法來處理請求,來
什麼是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.