1.先上幾張原理圖着重理解:html
如今針對第四副圖原理進行解析:程序員
流程:瀏覽器
1.瀏覽器發送請求緩存
2.服務器軟件(IIS)接收,它最終的目的就是爲了向客戶輸出它請求的動態頁面生成的html代碼。安全
3.服務器不會處理類和動態頁面,因此找擴展程序 服務器
4.交給FrameWork,它其中有個類HttpRuntime,其中有個ProcessRequest()方法併發
5.ProcessRequest()建立了HttpWorkerRequest對象,把請求報文都封裝在其中(HttpWorkerRequest中有個指針,它指向了擴展程序,待把後續返回的響應報文返回給IIS)asp.net
6.建立HttpContext對象(HttpRequest和HttpResponse)請求的報文被拆分紅了不一樣屬性而保存在HttpRequest中,方便程序員使用;HttpResponse準備了不少屬性,用來保存要生成的響應報文的各個部分。ui
7.framework要運行頁面對象,首先要建立HttpApplication對象,負責處理整個請求,頁面中執行須要環境、安全驗證等都封裝在其中。.net
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管理的輸出緩存中。此時能夠直接從緩存中提取信息並返回,無須從新處理一遍。