天天看點

Asp.Net頁面生命周期(多圖)

asp.net的請求處理模型已經講完幾個星期了,但一直沒有時間整理,一來是因為知識點确實繁雜,難以整理,二來了解得也不夠清晰,存在一些誤區。今天有空寫下這篇博文,希望大家指正其中的不足,以便能加深對請求響應的了解。

根據自己了解和老師講課的内容,花了一張圖

Asp.Net頁面生命周期(多圖)

2、請求封包被封裝為http請求,通過socket發送到IIS伺服器

4、使用者模式中IIS将請求發送到w3svc.exe程序中,

5、w3svc.exe将請求發到inetinfo.exe中。

8、如果請求的是靜态資源(img、html等),則由IIS将本地檔案内容輸出到浏覽器。

7、如果是動态資源,則告訴w3svc.exe應該把請求傳到對應的擴充子產品中,如aspx請求會配置設定到aspnet_isapi.dll擴充程式中

9、 aspnet_isapi.dll是一個擴充程式,實作了IIS内部的一些API,也是一種請求過濾的插件。它的作用是1.負責啟動托管環境。2.初始化 托管環境。3.将請求分發給托管環境。也就是說,它負責啟動aspnet  Runtime建立aspnet運作環境,将請求交給ISAPIRuntime的PR方法。

在IIS中,工作程序(w3wp.exe)運作着ASP.NET應用程式,管理并響應所有的請求,ASP.NET所有的功能都運作在工作程序下,當請求到來時,工作程序會生成Request和Response相關的資訊。簡而言之,工作程序就是ASP.NET程式的心髒。

11、 然後在擴充子產品中調用ISAPIRuntime(ISAPIRuntime是進入.NET托管環境的入口)的ProcessRequest方法,,該方法 要求傳入一個ecb句柄(ecb句柄指向請求封包的記憶體位址),将其建立為一個HttpWorkRequest對象。HttpWorkRequest隻是 對請求進行簡單的封裝。

12、将HttpWorkRequest對象放到HttpRuntime的ProcessRequest方法中,傳回一個HttpContext上下文對象。

15、使用者的請求是通過觸發HttpApplication的19個事件23個步驟進行處理的。如果是一般處理程式(.ashx),那麼執行完管道中的事件後按照原路進行傳回。如果是aspx頁面那麼就開始走頁面的生命周期了。

16、HttpApplication對HttpContext處理完成後,通過Socket傳回響應封包

17、浏覽器接收響應封包(解析Html并渲染Html标簽、CSS、JS)

下面是對管道的一些了解,圖是找來的,原圖有一些錯誤,已修正

Asp.Net頁面生命周期(多圖)
頁面的生命周期發生在第11至12個事件。執行步驟如下 1、建立頁面控件樹BuilderControlTree:将C#建立控件的代碼封裝到FrameworkInitliaze() 方法中,在方法内部将aspx所有控件new一個執行個體,然後構造樹結構 2、判斷是否回發,如果ViewState為null,則不是回發,IsPostBack為false,如果有值,則為True。 3、初始化包括三個階段:PreInit()預初始化:Init()初始化:InitComplete()初始化完成.做的主要操作是建立控件ID,然後将所有控件的Page屬性指向目前頁面 4、加載ViewState處理回發資料,将資料放到控件中,将需要觸發事件的控件放到一個集合裡面去。 6、第二次處理回發資料 7、觸發改變的事件和點選事件 8、加載完成 9、預渲染OnPreRender:最後改變頁面狀态,儲存對控件狀态做的更改 10、儲存頁面狀态SavaViewState:自動将控件的ViewState屬性保持到字元串對象中,并放到隐藏域中發送到用戶端 11、渲染Render: 頁面生命周期結束後,繼續管道之後的事件。 了解頁面的生命周期,有助于我們在适當的事件中放入邏輯,而不是一味的将邏輯放到頁面加載Page_Load中。以下是從網上截的一張圖。
Asp.Net頁面生命周期(多圖)

繼續閱讀