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

1、瀏覽器實際上是一個Socket客戶端,它向服務器發送請求報文

2、請求報文被封裝爲http請求,通過socket發送到IIS服務器

3、內核模式包含一個Http.SYS文件,它用來監聽端口,接收請求後將其發送到用戶模式。

4、用戶模式中IIS將請求發送到w3svc.exe進程中,

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

6、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方法。

10、aspnet_isapi.dll會將請求發到w3wp.exe中處理

在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上下文對象。

13、HttpContext上下文對象包含HttpRequest請求報文和HttpResponse響應報文

14、根據HttpApplication獲得一個HttpApplication對象的實例,獲取實例的時候,先去Application池中去找是否有空閒的HttpApplication對象,如果有則直接返回一個對象,不存在的話就就先編譯globle文件生成一個HttpApplication的派生類,通過反射創建一個HttpApplication實例並返回。並開始處理用戶的請求。

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

16、HttpApplication對HttpContext處理完成後,通過Socket返回響應報文

17、瀏覽器接收響應報文(解析Html並渲染Html標籤、CSS、JS)

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

頁面的生命週期發生在第11至12個事件。執行步驟如下

1、創建頁面控件樹BuilderControlTree:將C#創建控件的代碼封裝到FrameworkInitliaze() 方法中,在方法內部將aspx所有控件new一個實例,然後構造樹結構

2、判斷是否回發,如果ViewState爲null,則不是回發,IsPostBack爲false,如果有值,則爲True。

3、初始化包括三個階段:PreInit()預初始化:Init()初始化:InitComplete()初始化完成.做的主要操作是創建控件ID,然後將所有控件的Page屬性指向當前頁面

4、加載ViewState處理回發數據,將數據放到控件中,將需要觸發事件的控件放到一個集合裏面去。

5、預加載PreLoad,加載Load(Page_Load()),其實就是執行Page_Load裏的代碼

6、第二次處理回發數據

7、觸發改變的事件和點擊事件

8、加載完成

9、預渲染OnPreRender:最後改變頁面狀態,保存對控件狀態做的更改

10、保存頁面狀態SavaViewState:自動將控件的ViewState屬性保持到字符串對象中,並放到隱藏域中發送到客戶端

11、渲染Render:

頁面生命週期結束後,繼續管道之後的事件。

瞭解頁面的生命週期,有助於我們在適當的事件中放入邏輯,而不是一味的將邏輯放到頁面加載Page_Load中。以下是從網上截的一張圖。

感覺很不錯,轉載下 原網址:http://www.cnblogs.com/DotNetEnjoy/archive/2013/04/15/3022672.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章