新聞中心
一.什么是Asp.Net頁面生命周期
當我們在瀏覽器地址欄中輸入網(wǎng)址,回車查看頁面時,這時會向服務(wù)器端(IIS)發(fā)送一個request請求,服務(wù)器就會判斷發(fā)送過來的請求頁面, 完全識別 HTTP 頁面處理程序類后,ASP.NET 運行時將調(diào)用處理程序的 ProcessRequest 方法來處理請求,來創(chuàng)建頁面對象。通常情況下,無需更改此方法的實現(xiàn),因為它是由 Page 類提供的。接下來被創(chuàng)建頁面對象的ProcessRequest方法使頁面經(jīng)歷了各個階段:初始化、加載視圖狀態(tài)信息和回發(fā)數(shù)據(jù)、加載頁面的用戶代碼以及執(zhí)行回發(fā)服務(wù)器端事件。之后,頁面進入顯示模式:收集更新的視圖狀態(tài),生成 HTML 代碼并隨后將代碼發(fā)送到輸出控制臺。最后,卸載頁面,并認為請求處理完畢。其中頁面對象ProcessRequest方法 完成的這一系列事件的處理過程就是Asp.Net頁面生命周期。
二.了解Asp.Net頁面生命周期的好處
了解個掌握ASP.NET頁面生命周期是非常必要的,這有助于我們更加靈活的控制頁面,以我們需要的方式編程開發(fā)。ASP.NET頁運行時,此頁會經(jīng)歷一個又一個的事件鏈,每個事件鏈中執(zhí)行不同的行為,這所有的行為共同組成我們所需要的頁面。了解了生命周期也更有助于我們對程序調(diào)試中發(fā)生問題的地方的定位。
三.詳解Asp.Net頁面生命周期
(一)先看看在開始一個頁面生命周期之前,請求的頁面經(jīng)歷了那些過程。如圖所示:
通信處理過程:
當服務(wù)器運行正常的情況下,客戶端(瀏覽器)
向服務(wù)器端發(fā)送請求時,服務(wù)器端負責監(jiān)聽的套接字(socket),監(jiān)聽到有連接請求后,會為該客戶端建立一個用于通信的套接字與客戶端進行通信。當用戶在瀏覽器向服務(wù)器發(fā)送請求時,瀏覽器會按照雙方都約定好的網(wǎng)絡(luò)傳輸層http協(xié)議,將請求轉(zhuǎn)換成符合Http協(xié)議的請求報文。然后通過設(shè)備按照TCP協(xié)議發(fā)送到服務(wù)器。在服務(wù)器端接收到請求報文后。會按照Http協(xié)議對報文進行解析。若請求的內(nèi)容為靜態(tài)的數(shù)據(jù),服務(wù)器端直接將被請求的數(shù)據(jù),按照Http協(xié)議生成響應(yīng)報文后返回給瀏覽器。瀏覽器然后解析收到的報文。將頁面顯示到瀏覽器窗口。(注:最開始僅是顯示一個html 框架。經(jīng)過多次請求。將CSS樣式,圖片………逐一的加載進來形成一個完整的頁面。這個過程,有多次的交互通信。當通信結(jié)束后會把用來通信的套接字銷毀,因為http協(xié)議是一種無狀態(tài)的通信。這樣減輕了服務(wù)器的壓力)
當瀏覽器向客戶端發(fā)送的請求為動態(tài)的。那么服務(wù)器(IIS)發(fā)現(xiàn)處理不了這種后綴名的文件時,會通過映射表到。響應(yīng)實現(xiàn)了接口的可擴展程序asp.net_isapi.dll, 然后asp.net_isapi.dll,又將請求轉(zhuǎn)交給網(wǎng)站程序處理.網(wǎng)站程序調(diào)用
httpRuntime類的processRequest方法來處理:
1. 此類會分析接收到的請求報文.將請求報文封裝到名稱為httpWorkerRequest的類的屬性中(便于其它地方以用).
2. 創(chuàng)建HttpContext對象.這個對象是當前所請求報文的上下文環(huán)境.它包含了所有的請求數(shù)據(jù).其中有兩個最重要類的對象:http.Request和http.Response. 在httpRequest對象中又包含了兩個屬性.Form(通過表單請求的數(shù)據(jù)參數(shù)).Querystring(通過URL傳遞的數(shù)據(jù)參數(shù)); 通過索引器,可以找到參數(shù)的值. 在httpResponse 對象中有一個TextWriter對象.在它里面保存的是被請求的頁面在執(zhí)行過程中要向瀏覽器輸出的數(shù)據(jù).可以通過write 方法對其進行輸出給瀏覽器。
3. 通過HttpApplicationFactory類的的一個靜態(tài)方法。來為每個請求創(chuàng)建一個單獨的httpApplication對象。在創(chuàng)建之前HttpApplicationFactor會到HttpApplication池中查看,有沒有空閑的。若有直接用。沒有的時候才創(chuàng)建新的HttpApplication。
4. 在httpApplication里運行己轉(zhuǎn)換成接口IhttpHandler 的通過反射被請求頁面對象的ProcessRequest 方法.
方法執(zhí)行過程如下:先執(zhí)行httpApplication中的processRequest方法。在此方法中包含了要按照先后順序執(zhí)行的19個委托事件 當在執(zhí)行到第8個事件的時候就開始創(chuàng)建被請求頁面對象,在執(zhí)行到第11和第12個事件之間時。就執(zhí)行被創(chuàng)建的請求頁面對象的ProcessRequest方法。
(二)開始頁面生命周期
1.頁面生命周期的主要階段包括: 階段 事件/方法
頁面初始化 Page_Init
加載View State LoadViewState
回發(fā)數(shù)據(jù)處理 LoadPostData
頁面加載 Page_Load
回發(fā)通知 RaisePostDataChangedEvent
回發(fā)事件處理 RaisePostBackEvent
頁面預(yù)渲染 Page_PreRender
保存 viewstate SaveViewState
Page渲染 Page_Render
Page 卸載 Page_UnLoad
2.頁面生命周期的主要事件:
PreInit:
1.檢查IsPostBack 屬性
2.動態(tài)設(shè)置Master Page
3.動態(tài)設(shè)置Theme
4.設(shè)置控件的默認值(UniqueId等)
5.重新創(chuàng)建動態(tài)控件(初始化控件),初始化控件的值
Init: 這個事件發(fā)生在所有的控件被初始化,所有的皮膚設(shè)置被應(yīng)用以后。它用來讀取或者初始化控件屬性。它能夠用來注冊一些aspx頁面中沒有指出的控件的事件。
InitComplete: Use this event for processing tasks that require all initialization to be complete.
PreLoad: 加載頁面的ViewState和所有的控件,然后處理所有的包含在Request實例中的postback數(shù)據(jù)。
Load: 這個事件可能是大家最熟悉的了。需要注意的是,Page對象會遞歸的調(diào)用子控件的onload事件直到頁面和所有的子控件被加載完成。這個事件主要用來設(shè)置控件屬性的值,建立數(shù)據(jù)庫連接(通常不這么做)。
Validation: 如果你的控件要求驗證,驗證會在這個階段發(fā)生,這個時候你可以檢查控件的IsValid屬性。跟這個階段關(guān)聯(lián)的事件是Validate,它有一個可以接受驗證字符串群的重載方法(overload method),這個重載方法執(zhí)行特定控件群的驗證。
Control events: 這個就不多說了,主要是處理控件的事件,例如click。這也就讓我們明白了每次我們click一個Button的時候,實際上是要先去執(zhí)行l(wèi)oad事件然后才執(zhí)行click事件的,一般我們用!IsPostBack來判斷一下從而避免執(zhí)行不必要的加載邏輯。
LoadComplete: 頁面所有的控件都被加載以后執(zhí)行,暫時沒有想到用來干什么。。。
PreRender: 在HTML被生成之前這是最后一個事件。每一個頁面中的控件都有PreRender的過程。在這里對將要輸出的HTML結(jié)果進行最后一次修改。
SaveStateComplete: 在這個時間發(fā)生之前,已經(jīng)保存了所有控件和頁面的,任何對page或者控件的改動都不會產(chǎn)生左右。暫時沒想到用來干啥。
Render: 它不是一個事件而是一個方法。工作就是把HTML寫回客戶端瀏覽器。
UnLoad: 頁面中的每一個控件都會發(fā)生這件事。在控件中,使用這個事件來做清理工作,例如關(guān)閉數(shù)據(jù)庫連接等。對與頁面本身也是做清理工作,例如關(guān)閉打開的文件和數(shù)據(jù)庫連接,或者結(jié)束日志或者其它指定的工作。
需要說明的是,每次Request都會創(chuàng)建一個全新的Page類的實例,所以在頁面中的自己定義的字段是不能在兩次request中傳遞值的,需要使用viewstate來存儲。
頁面處理的整體過程圖解
四.什么地方用到了Asp.Net頁面生命周期
對于這個問題,在面試中我遇到過,我覺得問這個問題有點不正常。我當時回答的是。Viewstate 對值的記錄上用到了生命周期,總是覺對不太對。
生命周期理解了,并不代表我們會用它。只有理解了,我們才會在以后的工作中慢慢真正的懂它,用它。
總結(jié):計劃了好久,一直沒有寫,今天下定決心一定要寫了。終于完成了。我看有一位博友的用三張圖片詳解Asp.Net 全生命周期還不錯。用圖結(jié)構(gòu)清晰,更便于理解。故貼到下面便于博友們和以后自己的查看。原文地址:http://www.cnblogs.com/zhaoyang/archive/2011/11/16/2251200.html
說明:
1 第一張圖片從全局說明從客戶端發(fā)出一個Request請求,服務(wù)器windows內(nèi)核中的HTTP.SYS組件接收該請求開始到IIS處理完該請求并響應(yīng)到客戶端結(jié)束。
2 第二張圖片為圖1中Http處理管線的詳細步驟
3 第三張圖片為圖2Http處理管線中調(diào)用處理程序(HttpHandler, 此處為Page對象)的詳細生命周期過程。
圖1:
圖2.
圖3.
原文連接:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html
文章標題:Asp.Net頁面生命周期[轉(zhuǎn)]-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/ecdpj.html