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