Asp.Net頁面生命周期

来源:http://www.cnblogs.com/klsw/archive/2016/03/14/5277542.html
-Advertisement-
Play Games

什麼是Asp.Net頁面生命周期 當我們在瀏覽器地址欄中輸入網址,回車查看頁面時,這時會向伺服器端(IIS)發送一個request請求,伺服器就會判斷發送過來的請求頁面,  完全識別 HTTP 頁面處理程式類後,ASP.NET 運行時將調用處理程式的 ProcessRequest 方法來處理請求,來


什麼是Asp.Net頁面生命周期

當我們在瀏覽器地址欄中輸入網址,回車查看頁面時,這時會向伺服器端(IIS)發送一個request請求,伺服器就會判斷發送過來的請求頁面,  完全識別 HTTP 頁面處理程式類後,ASP.NET 運行時將調用處理程式的 ProcessRequest 方法來處理請求,來創建頁面對象。通常情況下,無需更改此方法的實現,因為它是由 Page 類提供的。接下來被創建頁面對象的ProcessRequest方法使頁面經歷了各個階段:初始化、載入視圖狀態信息和回發數據、載入頁面的用戶代碼以及執行回發伺服器端事件。之後,頁面進入顯示模式:收集更新的視圖狀態,生成 HTML 代碼並隨後將代碼發送到輸出控制台。最後,卸載頁面,並認為請求處理完畢。其中頁面對象ProcessRequest方法 完成的這一系列事件的處理過程就是Asp.Net頁面生命周期。

二.瞭解Asp.Net頁面生命周期的好處

瞭解個掌握ASP.NET頁面生命周期是非常必要的,這有助於我們更加靈活的控制頁面,以我們需要的方式編程開發。ASP.NET頁運行時,此頁會經歷一個又一個的事件鏈,每個事件鏈中執行不同的行為,這所有的行為共同組成我們所需要的頁面。瞭解了生命周期也更有助於我們對程式調試中發生問題的地方的定位。

三.詳解Asp.Net頁面生命周期

(一)先看看在開始一個頁面生命周期之前,請求的頁面經歷了那些過程。如圖所示:

通信處理過程:

當伺服器運行正常的情況下,客戶端(瀏覽器)
向伺服器端發送請求時,伺服器端負責監聽的套接字(socket),監聽到有連接請求後,會為該客戶端建立一個用於通信的套接字與客戶端進行通信。當用戶在瀏覽器向伺服器發送請求時,瀏覽器會按照雙方都約定好的網路傳輸層http協議,將請求轉換成符合Http協議的請求報文。然後通過設備按照TCP協議發送到伺服器。在伺服器端接收到請求報文後。會按照Http協議對報文進行解析。若請求的內容為靜態的數據,伺服器端直接將被請求的數據,按照Http協議生成響應報文後返回給瀏覽器。瀏覽器然後解析收到的報文。將頁面顯示到瀏覽器視窗。(註:最開始僅是顯示一個html 框架。經過多次請求。將CSS樣式,圖片………逐一的載入進來形成一個完整的頁面。這個過程,有多次的交互通信。當通信結束後會把用來通信的套接字銷毀,因為http協議是一種無狀態的通信。這樣減輕了伺服器的壓力)

當瀏覽器向客戶端發送的請求為動態的。那麼伺服器(IIS)發現處理不了這種尾碼名的文件時,會通過映射表到。響應實現了介面的可擴展程式asp.net_isapi.dll, 然後asp.net_isapi.dll,又將請求轉交給網站程式處理.網站程式調用

httpRuntime類的processRequest方法來處理:

1.此類會分析接收到的請求報文.將請求報文封裝到名稱為httpWorkerRequest的類的屬性中(便於其它地方以用).

2.創建HttpContext對象.這個對象是當前所請求報文的上下文環境.它包含了所有的請求數據.其中有兩個最重要類的對象:http.Request和http.Response.  在httpRequest對象中又包含了兩個屬性.Form(通過表單請求的數據參數).Querystring(通過URL傳遞的數據參數); 通過索引器,可以找到參數的值. 在httpResponse 對象中有一個TextWriter對象.在它裡面保存的是被請求的頁面在執行過程中要向瀏覽器輸出的數據.可以通過write 方法對其進行輸出給瀏覽器。

3.通過HttpApplicationFactory類的的一個靜態方法。來為每個請求創建一個單獨的httpApplication對象。在創建之前HttpApplicationFactor會到HttpApplication池中查看,有沒有空閑的。若有直接用。沒有的時候才創建新的HttpApplication。

4.在httpApplication里運行己轉換成介面IhttpHandler 的通過反射被請求頁面對象的ProcessRequest 方法.

方法執行過程如下:先執行httpApplication中的processRequest方法。在此方法中包含了要按照先後順序執行的19個委托事件 當在執行到第8個事件的時候就開始創建被請求頁面對象,在執行到第11和第12個事件之間時。就執行被創建的請求頁面對象的ProcessRequest方法。

(二)開始頁面生命周期

1.頁面生命周期的主要階段包括: 階段 事件/方法
頁面初始化          Page_Init
載入View State      LoadViewState
回發數據處理      LoadPostData
頁面載入          Page_Load
回發通知          RaisePostDataChangedEvent
回發事件處理     RaisePostBackEvent
頁面預渲染       Page_PreRender
保存             viewstate SaveViewState
Page渲染         Page_Render
Page 卸載       Page_UnLoad

2.頁面生命周期的主要事件:

PreInit:

1.檢查IsPostBack 屬性

2.動態設置Master Page

3.動態設置Theme

4.設置控制項的預設值(UniqueId等)

5.重新創建動態控制項(初始化控制項),初始化控制項的值

Init: 這個事件發生在所有的控制項被初始化,所有的皮膚設置被應用以後。它用來讀取或者初始化控制項屬性。它能夠用來註冊一些aspx頁面中沒有指出的控制項的事件。

InitComplete: Use this event for processing tasks that require all initialization to be complete.

PreLoad: 載入頁面的ViewState和所有的控制項,然後處理所有的包含在Request實例中的postback數據。

Load: 這個事件可能是大家最熟悉的了。需要註意的是,Page對象會遞歸的調用子控制項的onload事件直到頁面和所有的子控制項被載入完成。這個事件主要用來設置控制項屬性的值,建立資料庫連接(通常不這麼做)。

Validation: 如果你的控制項要求驗證,驗證會在這個階段發生,這個時候你可以檢查控制項的IsValid屬性。跟這個階段關聯的事件是Validate,它有一個可以接受驗證字元串群的重載方法(overload method),這個重載方法執行特定控制項群的驗證。

Control events: 這個就不多說了,主要是處理控制項的事件,例如click。這也就讓我們明白了每次我們click一個Button的時候,實際上是要先去執行load事件然後才執行click事件的,一般我們用!IsPostBack來判斷一下從而避免執行不必要的載入邏輯。

LoadComplete: 頁面所有的控制項都被載入以後執行,暫時沒有想到用來乾什麼。。。

PreRender: 在HTML被生成之前這是最後一個事件。每一個頁面中的控制項都有PreRender的過程。在這裡對將要輸出的HTML結果進行最後一次修改。

SaveStateComplete: 在這個時間發生之前,已經保存了所有控制項和頁面的,任何對page或者控制項的改動都不會產生左右。暫時沒想到用來幹啥。

Render: 它不是一個事件而是一個方法。工作就是把HTML寫回客戶端瀏覽器。

UnLoad: 頁面中的每一個控制項都會發生這件事。在控制項中,使用這個事件來做清理工作,例如關閉資料庫連接等。對與頁面本身也是做清理工作,例如關閉打開的文件和資料庫連接,或者結束日誌或者其它指定的工作。

需要說明的是,每次Request都會創建一個全新的Page類的實例,所以在頁面中的自己定義的欄位是不能在兩次request中傳遞值的,需要使用viewstate來存儲。

頁面處理的整體過程圖解

四.什麼地方用到了Asp.Net 頁面生命周期

   對於這個問題,在面試中我遇到過,我覺得問這個問題有點不正常。我當時回答的是。Viewstate 對值的記錄上用到了生命周期,總是覺對不太對。

生命周期理解了,並不代表我們會用它。只有理解了,我們才會在以後的工作中慢慢真正的懂它,用它。

總結:計划了好久,一直沒有寫,今天下定決心一定要寫了。終於完成了。我看有一位博友的用三張圖片詳解Asp.Net 全生命周期還不錯。用圖結構清晰,更便於理解。故貼到下麵便於博友們和以後自己的查看。原文地址:http://www.cnblogs.com/zhaoyang/archive/2011/11/16/2251200.html

說明:

1  第一張圖片從全局說明從客戶端發出一個Request請求,伺服器windows內核中的HTTP.SYS組件接收該請求開始到IIS處理完該請求並響應到客戶端結束。

2  第二張圖片為圖1中Http處理管線的詳細步驟

3  第三張圖片為圖2Http處理管線中調用處理程式(HttpHandler,  此處為Page對象)的詳細生命周期過程。

圖1:

圖2.

圖3.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •   線纜作為連接器件,相當於不同系統之間溝通的“橋梁”,選擇線纜類型的好壞,也決定著傳輸信號的質量,影響著整個系統的穩定性。 (1)特性阻抗   先說一下關於線纜在傳輸過程中的特性阻抗問題。   特性阻抗是指電纜無限長時該電纜所具有的阻抗,阻抗是阻止交流電流通的一種電阻,(所以萬用表測不能直接測出一
  •  
  •  
  • 最後要用一方法判斷ip地址是否正確,直接用.Net現成的類,方法如下:
  • 某一時候,為文本框(TextBox)裝飾個水印。它有兩種狀態,一是blur和focus。因此,我們可以在Javascript寫兩個事件: 演示:    
  • 【問】 在C#和Visual Basic的轉換中,以下一些轉換的用法和區別是什麼呢? [C#] [VB.NET] 【錯誤回答】 沒有區別,因為運行了之後都可以正常轉化。 【正解】 光從運行結果來看當然是毫無區別,因為題目所給出的僅僅是一部分的例子,不是全部。許多初學者容易產生“以偏概全”的錯誤認識。
  • 我希望能理解在瀏覽器輸入URL並敲擊回車來請求一個ASP.NET MVC網站的頁面之後發生的任何事情。 為什麼需要關心這些?有兩個原因。首先是因為ASP.NET MVC是一個擴展性非常強的框架。例如,我們可以插入不同的ViewEngine來控制網站內容呈現的方式。我們還可以定義控制器生成和分配到某個
  • 事件,定義了事件成員的類型允許類型或類型的實例通知其它對象發生了特定的事情。 按照我自己的理解而言,事件可以被(方法)關註,也可以被(方法)取消關註,事件發生後關註了事件的一方會瞭解到,並對事件做出相應的應對(執行方法)。(我每次都是這麼理解的,這樣從字面意義上更好理解一點) 眾所周知,事件實際上就
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...