Asp.Net页面生命周期(多图)
抽空用viso畫(huà)了請(qǐng)求處理模型圖
?
1、瀏覽器實(shí)際上是一個(gè)Socket客戶端,它向服務(wù)器發(fā)送請(qǐng)求報(bào)文
2、請(qǐng)求報(bào)文被封裝為http請(qǐng)求,通過(guò)socket發(fā)送到IIS服務(wù)器
3、內(nèi)核模式包含一個(gè)Http.SYS文件,它用來(lái)監(jiān)聽(tīng)端口,接收請(qǐng)求后將其發(fā)送到用戶模式。
4、用戶模式中IIS將請(qǐng)求發(fā)送到w3svc.exe進(jìn)程中,
5、w3svc.exe將請(qǐng)求發(fā)到inetinfo.exe中。
6、inetinfo.exe截獲請(qǐng)求后,根據(jù)資源映射信息,將請(qǐng)求的資源分配到特定的處理程序模塊。
8、如果請(qǐng)求的是靜態(tài)資源(img、html等),則由IIS將本地文件內(nèi)容輸出到瀏覽器。
7、如果是動(dòng)態(tài)資源,則告訴w3svc.exe應(yīng)該把請(qǐng)求傳到對(duì)應(yīng)的擴(kuò)展模塊中,如aspx請(qǐng)求會(huì)分配到aspnet_isapi.dll擴(kuò)展程序中
9、aspnet_isapi.dll是一個(gè)擴(kuò)展程序,實(shí)現(xiàn)了IIS內(nèi)部的一些API,也是一種請(qǐng)求過(guò)濾的插件。它的作用是1.負(fù)責(zé)啟動(dòng)托管環(huán)境。2.初始化托管環(huán)境。3.將請(qǐng)求分發(fā)給托管環(huán)境。也就是說(shuō),它負(fù)責(zé)啟動(dòng)aspnet? Runtime創(chuàng)建aspnet運(yùn)行環(huán)境,將請(qǐng)求交給ISAPIRuntime的PR方法。
10、aspnet_isapi.dll會(huì)將請(qǐng)求發(fā)到w3wp.exe中處理
在IIS中,工作進(jìn)程(w3wp.exe)運(yùn)行著ASP.NET應(yīng)用程序,管理并響應(yīng)所有的請(qǐng)求,ASP.NET所有的功能都運(yùn)行在工作進(jìn)程下,當(dāng)請(qǐng)求到來(lái)時(shí),工作進(jìn)程會(huì)生成Request和Response相關(guān)的信息。簡(jiǎn)而言之,工作進(jìn)程就是ASP.NET程序的心臟。
11、然后在擴(kuò)展模塊中調(diào)用ISAPIRuntime(ISAPIRuntime是進(jìn)入.NET托管環(huán)境的入口)的ProcessRequest方法,,該方法要求傳入一個(gè)ecb句柄(ecb句柄指向請(qǐng)求報(bào)文的內(nèi)存地址),將其創(chuàng)建為一個(gè)HttpWorkRequest對(duì)象。HttpWorkRequest只是對(duì)請(qǐng)求進(jìn)行簡(jiǎn)單的封裝。
?
12、將HttpWorkRequest對(duì)象放到HttpRuntime的ProcessRequest方法中,返回一個(gè)HttpContext上下文對(duì)象。
13、HttpContext上下文對(duì)象包含HttpRequest請(qǐng)求報(bào)文和HttpResponse響應(yīng)報(bào)文
14、根據(jù)HttpApplication獲得一個(gè)HttpApplication對(duì)象的實(shí)例,獲取實(shí)例的時(shí)候,先去Application池中去找是否有空閑的HttpApplication對(duì)象,如果有則直接返回一個(gè)對(duì)象,不存在的話就就先編譯globle文件生成一個(gè)HttpApplication的派生類,通過(guò)反射創(chuàng)建一個(gè)HttpApplication實(shí)例并返回。并開(kāi)始處理用戶的請(qǐng)求。
15、用戶的請(qǐng)求是通過(guò)觸發(fā)HttpApplication的19個(gè)事件23個(gè)步驟進(jìn)行處理的。如果是一般處理程序(.ashx),那么執(zhí)行完管道中的事件后按照原路進(jìn)行返回。如果是aspx頁(yè)面那么就開(kāi)始走頁(yè)面的生命周期了。
16、HttpApplication對(duì)HttpContext處理完成后,通過(guò)Socket返回響應(yīng)報(bào)文
17、瀏覽器接收響應(yīng)報(bào)文(解析Html并渲染Html標(biāo)簽、CSS、JS)
下面是對(duì)管道的一些理解,圖是找來(lái)的,原圖有一些錯(cuò)誤,已修正
?
頁(yè)面的生命周期發(fā)生在第11至12個(gè)事件。執(zhí)行步驟如下
1、創(chuàng)建頁(yè)面控件樹(shù)BuilderControlTree:將C#創(chuàng)建控件的代碼封裝到FrameworkInitliaze() 方法中,在方法內(nèi)部將aspx所有控件new一個(gè)實(shí)例,然后構(gòu)造樹(shù)結(jié)構(gòu)
2、判斷是否回發(fā),如果ViewState為null,則不是回發(fā),IsPostBack為false,如果有值,則為True。
3、初始化包括三個(gè)階段:PreInit()預(yù)初始化:Init()初始化:InitComplete()初始化完成.做的主要操作是創(chuàng)建控件ID,然后將所有控件的Page屬性指向當(dāng)前頁(yè)面
4、加載ViewState處理回發(fā)數(shù)據(jù),將數(shù)據(jù)放到控件中,將需要觸發(fā)事件的控件放到一個(gè)集合里面去。
5、預(yù)加載PreLoad,加載Load(Page_Load()),其實(shí)就是執(zhí)行Page_Load里的代碼
6、第二次處理回發(fā)數(shù)據(jù)
7、觸發(fā)改變的事件和點(diǎn)擊事件
8、加載完成
9、預(yù)渲染OnPreRender:最后改變頁(yè)面狀態(tài),保存對(duì)控件狀態(tài)做的更改
10、保存頁(yè)面狀態(tài)SavaViewState:自動(dòng)將控件的ViewState屬性保持到字符串對(duì)象中,并放到隱藏域中發(fā)送到客戶端
11、渲染Render:
頁(yè)面生命周期結(jié)束后,繼續(xù)管道之后的事件。
了解頁(yè)面的生命周期,有助于我們?cè)谶m當(dāng)?shù)氖录蟹湃脒壿?#xff0c;而不是一味的將邏輯放到頁(yè)面加載Page_Load中。以下是從網(wǎng)上截的一張圖。
轉(zhuǎn)載于:https://www.cnblogs.com/CoderO3/archive/2013/04/15/3022672.html
總結(jié)
以上是生活随笔為你收集整理的Asp.Net页面生命周期(多图)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle emp数据库或数据误删恢复
- 下一篇: android EditView