Asp.Net頁面生命周期
我們都知道,瀏覽器的作用就是將用戶請求的內(nèi)容封裝成HTTP報文的形式,然后通過Socekt套接字和域名解析服務(wù)器(DNS)將域名轉(zhuǎn)成ip地址發(fā)送到服務(wù)器。
服務(wù)器端的Windows操作系統(tǒng)分為兩個部分,IIS運行在用戶模式下,而監(jiān)聽80端口的那部分是運行在內(nèi)核模式HTTP.SYS(內(nèi)核模塊也是一個插件機制。socket通信機制在內(nèi)核模塊中,內(nèi)核模塊也是一種通信機制)下的,屬于HTTP處理的內(nèi)核模塊,內(nèi)核模式可以監(jiān)聽當前機器所有的Http請求,并將當前請求進行簡單解析,確定協(xié)議的類型請求的端口,訪問注冊表,確定當前的請求需要交給IIS進行處理。
IIS接收到請求之后,訪問INetInfo.exe(IIS主進程中的元數(shù)據(jù)信息),判斷文件的類型并查詢當前的請求需要經(jīng)過那個擴展程序處理。如果是靜態(tài)文件(html.,js,jpeg.git),直接將文件從服務(wù)器讀取出來按照原路返回,如果是動態(tài)文件(ashx,aspx),則交給擴展程序aspnet_isapi.dll文件執(zhí)行,aspnet_isapi.dll是一個擴展程序,實現(xiàn)了IIS內(nèi)部的一些API,也是一種請求過濾的插件。它的作用是1.負責啟動托管環(huán)境。2.初始化托管環(huán)境。3.將請求分發(fā)給托管環(huán)境。也就是說,它負責啟動aspnet Runtime創(chuàng)建aspnet運行環(huán)境,將請求交給ISAPIRuntime的PR方法。
ISAPIRuntime是進入NET托管環(huán)境的入口,它在方法中通過一個ecb句柄指向了當前請求報文體的內(nèi)存地址,將HTTP請求報文簡單封裝為一個HttpWorkRequest對象。
調(diào)用HttpRuntime.PR(wr:(HttpWorkRequest對象))根據(jù) HttpWorkRequest對象封裝成一個HttpContext上下文對象,它包含了所有的請求信息.然后交給HttpApplicationFactory進行處理。
根據(jù)HttpApplication獲得一個HttpApplication對象的實例,獲取實例的時候,先去Application池中去找是否有空閑的HttpApplication對象,如果有則直接返回一個對象,不存在的話就就先編譯globle文件生成一個HttpApplication的派生類,通過反射創(chuàng)建一個HttpApplication實例并返回。并開始處理用戶的請求。
用戶的請求是通過觸發(fā)HttpApplication的19個事件23個步驟進行處理的。如果是一般處理程序(.ashx),那么執(zhí)行完管道中的事件后按照原路進行返回。如果是aspx頁面那么就開始走頁面的生命周期了。
頁面生命周期的主要步驟如下:
1.創(chuàng)建頁面控制樹,那么如何創(chuàng)建頁面樹的結(jié)構(gòu)呢?把它封裝成了一個方法,這個方法的名字就叫做FrameworkInitliaze() 在方法內(nèi)部給aspx上所有的控件都New一個實例,然后構(gòu)造一個樹的結(jié)構(gòu)即是有一個樹的結(jié)構(gòu)。只有執(zhí)行創(chuàng)建頁面之后,頁面上才會有控件。
2.判斷IspostBack,確定是否回發(fā)。
3.初始化
初始化包括三個階段:
1)PreInint()預初始化
A.調(diào)用OnPreinit方法引發(fā)PreInit事件
B.利用App_Themes目錄中的內(nèi)容進行初始化主題。以動態(tài)實現(xiàn)一個PageThem
屬性值,并創(chuàng)建一個編譯類的實例。
C.應用模板頁
2)開始初始化,將所創(chuàng)建的控件樹上的控件都new一個實例并賦默認值。
A.遞歸初始化Controls集合中的控件,初始化包括設(shè)置這些控件的屬性。
B.遞歸應用控件皮膚。
C.調(diào)用OnInit方法以引發(fā)自身的Init事件,接著遞歸調(diào)用子控件的OnInit方法來
引發(fā)他們的Init事件。
D.調(diào)用自身的TrackViewState方法重啟自身的視圖狀態(tài)跟蹤,接著遞歸調(diào)用子控
件的TrackViewState方法重啟自身的視圖狀態(tài)跟蹤。
3)InitComplete()初始化完成
4.加載ViewState處理回發(fā)數(shù)據(jù):
加載頁面狀態(tài),解析隱藏域中的ViewState,ViewState保持的值賦值到對應
控件中。把需要觸發(fā)事件的控件放到一個集合當中去。
5.預加載(PreLoad)
頁面調(diào)用OnPreLoad方法以引發(fā)PreLoad事件,該事件表示頁面生命周期進
入加載階段。對應sapx.cs中的Page_Load事件。
6.加載(Load)
頁面首先調(diào)用自身的OnLoad方法以引發(fā)自身的Load事件,接著遞歸調(diào)用
Contorls集合中控件的OnLoad方法以引發(fā)它們的Load事件。
7.ProcessPostData第二次處理回發(fā)數(shù)據(jù)
8.觸發(fā)改變的事件和點擊事件。
9.頁面加載完成
10.預渲染,對空間樹進行最后一次處理
11.保存當前頁面的狀態(tài)。
12.頁面渲染
頁面生命周期結(jié)束后,形成了頁面,繼續(xù)執(zhí)行管道之后的事件,執(zhí)行完畢后按照原路返回到客戶端。
原文鏈接:http://www.cnblogs.com/hanwenhuazuibang/archive/2013/04/07/3003289.html
















 
 
 
 
 
 
 