1.先上幾張原理圖着重理解:
現在針對第四副圖原理進行解析:
流程:
1.瀏覽器發送請求
2.服務器軟件(IIS)接收,它最終的目的就是為了向客戶輸出它請求的動態頁面生成的html代碼。
3.服務器不會處理類和動態頁面,所以找擴展程序
4.交給FrameWork,它其中有個類HttpRuntime,其中有個ProcessRequest()方法
5.ProcessRequest()創建了HttpWorkerRequest對象,把請求報文都封裝在其中(HttpWorkerRequest中有個指針,它指向了擴展程序,待把后續返回的響應報文返回給IIS)
6.創建HttpContext對象(HttpRequest和HttpResponse)請求的報文被拆分成了不同屬性而保存在HttpRequest中,方便程序員使用;HttpResponse准備了很多屬性,用來保存要生成的響應報文的各個部分。
7.framework要運行頁面對象,首先要創建HttpApplication對象,負責處理整個請求,頁面中執行需要環境、安全驗證等都封裝在其中。
8.它要調用ProcessRequest (HttpContext context) 執行19個(事件)委托對象,也被叫做請求軌道。
9.其中在執行到第8個事件中創建請求的頁面類對象,並轉成HttpHandler接口對象
10.在11和12事件之間調用了ProcessRequest方法,最后有個finshRequest方法,結束了請求,生成響應報文,再通過HttpWorkerRequest的指針調用擴展程序再調用IIS,IIS最后將響應報文發回給瀏覽器
此時一般處理程序流程已經結束。
asp.net頁面運行的整體流程和一般處理程序一樣,不同之處在於它調用了Page類的ProcessRequest方法,創建了頁面控件樹,執行了頁面聲明周期。
流程:
1.調用了Page類的ProcessRequest方法
2.打造頁面控件樹(_buildControTree()方法)
3.執行頁面生命周期(也就是200多行代碼),里面有預定義好的很多種方法,方便程序員在事件中注冊方法,實現自己的功能
3.1 LoadState加載狀態
3.2 PageLoad 頁面加載
3.3 SaveState
4.調用Render方法,生成html代碼
注意:頁面自動事件注冊機制-----在頁面的開頭部分,有AutoEventWireup = "true" ,即開啟自動事件注冊機制
開啟自動事件注冊機制后,只要遵循對應約定的格式,如Page_Load,
當頁面聲明周期調用PageLoad事件的時候,也就調用了我們的Page_Load方法
asp.net運行機制
1.當第一次訪問頁面時,頁面請求首先依次經過HttpModuls和HttpHandler的處理,服務器接收到HttpHandler的請求后將跳轉到需要訪問的頁面,然后Asp.net Engine 負責找到這個頁面后台的類,並實例化為一個臨時對象。在此過程中會觸發一系列的事件,一部分事件需要經過對象中的方法進行處理,之后服務器會將這個處理后頁面交給Response對象,然后再由Response對象將這個頁面發送到客戶端
2.因為服務器之間的會話已經建立,所以在這個頁面上重新提交一些信息並再次向服務器發送請求時,是不用再經過初始化頁面這一部分的工作的。故第二條線路是依次提交HttpModuls和HttpHandler請求,然后與臨時對象交互並返回。
3.第三條路線與第二條的不同之處在於,在處理請求時,如果涉及到需要調用asp.net Cache時,臨時對象直接從asp.net緩存中提取信息並返回。
4.第四條線路是在刷新頁面的時候,服務器接收到並發現這個請求曾經處理過,並將處理結果存儲到由一個由默認的HttpModule管理的輸出緩存中。此時可以直接從緩存中提取信息並返回,無須重新處理一遍。