深入了解asp.net框架。生命周期以及事件处理机制
剛接觸asp.net框架覺得很好奇。他的快速開發(fā)是怎么實(shí)現(xiàn)的。控件的狀態(tài)又是怎么保持的。我們都知道http是無狀態(tài)的。而且網(wǎng)上很多人都說使用asp.net框架使用服務(wù)器框架是非常慢的。
帶著這些疑問我們來了解asp.net框架吧
?
我們先來簡單說一下asp.net框架的執(zhí)行過程
當(dāng)瀏覽器發(fā)送一個(gè)請(qǐng)求 比如請(qǐng)求index.aspx?的頁面 到底經(jīng)過了哪些事情
1.首先客戶端會(huì)組織請(qǐng)求報(bào)文發(fā)送到iis服務(wù)器
2.iis服務(wù)器通過文件后綴到擴(kuò)展程序映射找到對(duì)應(yīng)的處理程序即,這里這是asp.net_isapi(經(jīng)典模式情況下)
3.通過這個(gè)程序?qū)⒄?qǐng)求報(bào)文發(fā)送到asp.net框架。最先處理的則是httpRuntime.ProcessRequset方法(以后我們簡稱PR方法)
? ? (1)這里會(huì)對(duì)請(qǐng)求報(bào)文進(jìn)行解析并封裝 (2)同時(shí)創(chuàng)建上下文對(duì)象 初始化相關(guān)屬性(httpRequset,httpResponse,seeson)
4.然后通過httpAplicationFactory工廠類創(chuàng)建一個(gè)httpAplication對(duì)象 ?這個(gè)對(duì)象主要是管理我們的事件管道
5.調(diào)用httpAplicaton對(duì)象的PR方法 傳遞HttpContext進(jìn)去 并執(zhí)行我們的事件管道
6.事件管道有22個(gè)事件但是我們只要關(guān)注19個(gè)就行了
7第8個(gè)管道到第九個(gè)管道之間則通過解析創(chuàng)建我們的前臺(tái)頁面類(我們的頁面編譯后也會(huì)是一個(gè)類繼承關(guān)系 <后臺(tái)頁面類<page) 然后將他保存到上下文的IhttpHander類型的RemapHandler-屬性中
8.第9個(gè)事件則通過判斷RemapHandelr是否實(shí)現(xiàn)了IRequiresSessionState接口如果實(shí)現(xiàn)了則通過讀取cookie中的sessionId在session池中知道對(duì)應(yīng)session對(duì)象
賦值到上下文的Session屬性。(這里曾經(jīng)的疑惑就豁然開朗了了。一般處理程序?yàn)楹我謩?dòng)實(shí)現(xiàn)這個(gè)接口才能使用session)
9.第11到第12個(gè)事件則調(diào)用RemapHandelr的PR方法這里相當(dāng)于有2個(gè)分支
? ?(1)首先我們來對(duì)比一下使用了服務(wù)器控件的頁面類和沒有使用服務(wù)器控件的頁面類
? ? ? ?沒用使用服務(wù)器控件頁面
?接下來我們看一下使用了服務(wù)器控件的頁面
從這里我們可以做個(gè)一個(gè)簡單對(duì)比
? ? ? ? ? ?使用了服務(wù)器控件我們知道最終都打造成控件對(duì)象(而我們知道創(chuàng)建對(duì)象是耗時(shí)的)
? ? ? ? ? 沒使用服務(wù)器控件的頁面只是將html寫入response 其他額外的操作都沒做
我們?cè)儆^察一下html的對(duì)比
10想解決以上疑惑 那么我們就得了解頁面的生命周期了
? ?前面我們所說的使用了服務(wù)器控件和不使用控件的頁面類對(duì)象實(shí)現(xiàn)的PR方法處理邏輯里面的不同點(diǎn)是 ?使用了服務(wù)器控件的頁面類
? ?的PR方法會(huì)將服務(wù)器控件以控件對(duì)象保存到數(shù)組里面。
? ?這個(gè)時(shí)候回調(diào)用頁面生命周期的一系列事件
? ? (1)LoadState將表單隱藏域 _ViewState的數(shù)據(jù)設(shè)置到頁面類對(duì)象的ViewState中 然后將viewState的數(shù)據(jù)綁定到對(duì)應(yīng)的控件屬性中(回發(fā)情況下 這里就是使用了數(shù)據(jù)源服務(wù)器控件保存狀態(tài)的原因了(listview DataList))
? ? (2)ProcessPostData ?這里會(huì)將提交的表單元素賦值給對(duì)應(yīng)的控件對(duì)象(表單類型服務(wù)器控件還原狀態(tài) textBox之類的)
? ? ?(3) PageLoad?這里則是調(diào)用后臺(tái)頁面的我們自己寫的處理邏輯的代碼了?
? ? ?(4)ProcessPostData 這里還會(huì)調(diào)用一次(之前很疑惑。想想也就明白了 比如我們?cè)赑ageLoad可能會(huì)動(dòng)態(tài)的創(chuàng)建控件對(duì)象。那么回發(fā)情況也要還原我們手動(dòng)創(chuàng)建的控件對(duì)象的值。那么為什么上面那一次不在這里一起處理。因?yàn)槲覀儠?huì)在PageLoad的時(shí)候通過this.服務(wù)器控件 的形式訪問 處理業(yè)務(wù))
? ? ?(5)RaiseChangeEvents方法執(zhí)行控件的非點(diǎn)擊事件
? ? ?(6)RaisePostBackEvents方法執(zhí)行控件的點(diǎn)擊事件
? ? ? ?我們觀察上面的控件綁定的事件后會(huì)生成一段js ?這段js 就是手動(dòng)觸發(fā)表單的提交事件 回發(fā)。并且把觸發(fā)事件的 服務(wù)器控件id發(fā)送到服務(wù)器。5 6環(huán)境則會(huì)調(diào)用觸發(fā)的服務(wù)器控件相應(yīng)事件
? ? ? 比如可以做一個(gè)測試 一個(gè)服務(wù)器控件綁定了change事件和click事件 那么 我們點(diǎn)擊這個(gè)事件后不僅click會(huì)在服務(wù)器調(diào)用 change也會(huì)
? ? ?(7)則吧新的數(shù)據(jù)源保存到頁面類的ViewState中。(下一次回發(fā)再還原)
? ? ? (8)最后則調(diào)用服務(wù)器控件的Render方法生成對(duì)應(yīng)的html 寫入response(多態(tài)的一種展現(xiàn)形式)
?
?
?發(fā)現(xiàn)寫代碼的時(shí)候更多時(shí)候回關(guān)注 自己寫的一段代碼會(huì)出現(xiàn)什么效果。而不會(huì)關(guān)注實(shí)現(xiàn)這個(gè)效果 程序中處理是千山萬水才走到這一步。 那么很多東西我們都不能自己把控。所以把現(xiàn)在理解的東西記下來 方便查閱
?
轉(zhuǎn)載于:https://www.cnblogs.com/LQBlog/p/5290115.html
總結(jié)
以上是生活随笔為你收集整理的深入了解asp.net框架。生命周期以及事件处理机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dynamics CRM2016 Web
- 下一篇: HDU-2829 Lawrence (D