程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> asp.net頁面生命周期,asp.net生命周期

asp.net頁面生命周期,asp.net生命周期

編輯:關於.NET

asp.net頁面生命周期,asp.net生命周期


Asp.Net頁面生命周期

一.什麼是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.

 

本文轉載至:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html

怕以後找不到先轉載過來,感謝作者大大,很好很詳細.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved