一.什麼是Asp.Net頁面生命週期 html
當咱們在瀏覽器地址欄中輸入網址,回車查看頁面時,這時會向服務器端(IIS)發送一個request請求,服務器就會判斷髮送過來的請求頁面, 徹底識別 HTTP 頁面處理程序類後,ASP.NET 運行時將調用處理程序的 ProcessRequest 方法來處理請求,來建立頁面對象。一般狀況下,無需更改此方法的實現,由於它是由 Page 類提供的。接下來被建立頁面對象的ProcessRequest方法使頁面經歷了各個階段:初始化、加載視圖狀態信息和回發數據、加載頁面的用戶代碼以及執行回發服務器端事件。以後,頁面進入顯示模式:收集更新的視圖狀態,生成 HTML 代碼並隨後將代碼發送到輸出控制檯。最後,卸載頁面,並認爲請求處理完畢。其中頁面對象ProcessRequest方法 完成的這一系列事件的處理過程就是Asp.Net頁面生命週期。 面試
二.瞭解Asp.Net頁面生命週期的好處 數據庫
瞭解個掌握ASP.NET頁面生命週期是很是必要的,這有助於咱們更加靈活的控制頁面,以咱們須要的方式編程開發。ASP.NET頁運行時,此頁會經歷一個又一個的事件鏈,每一個事件鏈中執行不一樣的行爲,這全部的行爲共同組成咱們所須要的頁面。瞭解了生命週期也更有助於咱們對程序調試中發生問題的地方的定位。 編程
三.詳解Asp.Net頁面生命週期 windows
(一)先看看在開始一個頁面生命週期以前,請求的頁面經歷了那些過程。如圖所示: api
通訊處理過程: 瀏覽器
當服務器運行正常的狀況下,客戶端(瀏覽器)
向服務器端發送請求時,服務器端負責監聽的套接字(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.
【轉自】https://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html