我們都知道浏覽器的作用就是將用戶請求的內容封裝成HTTP報文的形式然後通過Socekt套接字和域名解析服務器(DNS)將域名轉成ip地址發送到服務器
服務器端的Windows操作系統分為兩個部分IIS運行在用戶模式下而監聽端口的那部分是運行在內核模式HTTPSYS(內核模塊也是一個插件機制socket通信機制在內核模塊中內核模塊也是一種通信機制)下的屬於HTTP處理的內核模塊內核模式可以監聽當前機器所有的Http請求並將當前請求進行簡單解析確定協議的類型請求的端口訪問注冊表確定當前的請求需要交給IIS進行處理
IIS接收到請求之後訪問INetInfoexe(IIS主進程中的元數據信息)判斷文件的類型並查詢當前的請求需要經過那個擴展程序處理如果是靜態文件(htmljsjpeggit)直接將文件從服務器讀取出來按照原路返回如果是動態文件(ashxaspx)則交給擴展程序aspnet_isapidll文件執行aspnet_isapidll是一個擴展程序實現了IIS內部的一些API也是一種請求過濾的插件它的作用是負責啟動托管環境初始化托管環境將請求分發給托管環境也就是說它負責啟動aspnet Runtime創建aspnet運行環境將請求交給ISAPIRuntime的PR方法
ISAPIRuntime是進入NET托管環境的入口它在方法中通過一個ecb句柄指向了當前請求報文體的內存地址將HTTP請求報文簡單封裝為一個HttpWorkRequest對象
調用HttpRuntimePR(wr:(HttpWorkRequest對象))根據 HttpWorkRequest對象封裝成一個HttpContext上下文對象它包含了所有的請求信息然後交給HttpApplicationFactory進行處理
根據HttpApplication獲得一個HttpApplication對象的實例獲取實例的時候先去Application池中去找是否有空閒的HttpApplication對象如果有則直接返回一個對象不存在的話就就先編譯globle文件生成一個HttpApplication的派生類通過反射創建一個HttpApplication實例並返回並開始處理用戶的請求
用戶的請求是通過觸發HttpApplication的個事件個步驟進行處理的如果是一般處理程序(ashx)那麼執行完管道中的事件後按照原路進行返回如果是aspx頁面那麼就開始走頁面的生命周期了
頁面生命周期的主要步驟如下
創建頁面控制樹那麼如何創建頁面樹的結構呢?把它封裝成了一個方法這個方法的名字就叫做FrameworkInitliaze() 在方法內部給aspx上所有的控件都New一個實例然後構造一個樹的結構即是有一個樹的結構只有執行創建頁面之後頁面上才會有控件
判斷IspostBack確定是否回發
初始化
初始化包括三個階段
)PreInint()預初始化
A調用OnPreinit方法引發PreInit事件
B利用App_Themes目錄中的內容進行初始化主題以動態實現一個PageThem
屬性值並創建一個編譯類的實例
C應用模板頁
)開始初始化將所創建的控件樹上的控件都new一個實例並賦默認值
A遞歸初始化Controls集合中的控件初始化包括設置這些控件的屬性
B遞歸應用控件皮膚
C調用OnInit方法以引發自身的Init事件接著遞歸調用子控件的OnInit方法來
引發他們的Init事件
D調用自身的TrackViewState方法重啟自身的視圖狀態跟蹤接著遞歸調用子控
件的TrackViewState方法重啟自身的視圖狀態跟蹤
)InitComplete()初始化完成
加載ViewState處理回發數據
加載頁面狀態解析隱藏域中的ViewStateViewState保持的值賦值到對應
控件中把需要觸發事件的控件放到一個集合當中去
預加載(PreLoad)
頁面調用OnPreLoad方法以引發PreLoad事件該事件表示頁面生命周期進
入加載階段對應sapxcs中的Page_Load事件
加載(Load)
頁面首先調用自身的OnLoad方法以引發自身的Load事件接著遞歸調用
Contorls集合中控件的OnLoad方法以引發它們的Load事件
ProcessPostData第二次處理回發數據
觸發改變的事件和點擊事件
頁面加載完成
預渲染對空間樹進行最後一次處理
保存當前頁面的狀態
頁面渲染
頁面生命周期結束後形成了頁面繼續執行管道之後的事件執行完畢後按照原路返回到客戶端
From:http://tw.wingwit.com/Article/program/net/201311/16141.html