【轉載】ASP.NET應用程序與頁面生命周期

在本文中,我們將了解不同的事件,ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器(對于 ASP.NET 應用程序,通常為 IIS)發送請求為起點,直至將請求結果返回至瀏覽器結束。在這個過程中,首先我們需要了解ASP.NET請求的2個大致的步驟。其次我們將詳細了解 'httphandler ',' httpmodule和 asp.net 頁面對象(Page)中不同的事件的執行順序,邏輯。

二個步驟的過程:

asp.net請求處理,2步的過程如下所示,用戶發送一個請求到IIS 服務器:

1、asp.net創建一個運行時,可以處理請求。換句話說,它創建應用程序對象,請求,響應和上下文對象處理請求。

2、運行時一旦被創建,請求處理,通過一系列的事件處理模塊,Handler處理和頁面對象。簡稱MHPM (Module, handler, page and Module event)。

ASP.NET 應用程序生命周期的各個階段:

步驟1:用戶從 Web 服務器請求應用程序資源 ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器(對于 ASP.NET 應用程序,通常為 IIS)發送請求為起點。ASP.NET 是 Web 服務器下的 ISAPI 擴展。Web 服務器接收到請求時,會對所請求的文件的文件擴展名進行檢查,確定應由哪個 ISAPI 擴展處理該請求,然后將該請求傳遞給合適的 ISAPI 擴展。ASP.NET 處理已映射到其上的文件擴展名,如 .aspx、.ascx、.ashx 和 .asmx。

步驟2:ASP.NET 接收對應用程序的第一個請求 當 ASP.NET 接收到對應用程序中任何資源的第一個請求時,名為 ApplicationManager 的類會創建一個應用程序域。應用程序域為全局變量提供應用程序隔離,并允許單獨卸載每個應用程序。在應用程序域中,將為名為 HostingEnvironment 的類創建一個實例,該實例提供對有關應用程序的信息(如存儲該應用程序的文件夾的名稱)的訪問。

步驟3:為每個請求創建 ASP.NET 核心對象 創建了應用程序域并對 HostingEnvironment 對象進行了實例化之后,ASP.NET 將創建并初始化核心對象,如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 類包含特定于當前應用程序請求的對象,如 HttpRequest 和 HttpResponse 對象。HttpRequest對象包含有關當前請求的信息,包括 Cookie 和瀏覽器信息。HttpResponse 對象包含發送到客戶端的響應,包括所有呈現的輸出和 Cookie。

步驟4:將 HttpApplication 對象分配給請求初始化所有核心應用程序對象之后,將通過創建 HttpApplication 類的實例啟動應用程序。如果應用程序具有 Global.asax 文件,則 ASP.NET 會創建 Global.asax 類(從 HttpApplication 類派生)的一個實例,并使用該派生類表示應用程序。

:第一次在應用程序中請求 ASP.NET 頁或進程時,將創建 HttpApplication 的一個新實例。不過,為了盡可能提高性能,可對多個請求重復使用 HttpApplication 實例。

步驟5: 由 HttpApplication 管線處理請求 MHPM (Module, handler, page and Module event)。

使用MHPM (Module, handler, page and Module event) 事件處理請求
一旦 HttpApplication對象創建,在處理該請求時將由 HttpApplication 類執行。我們來了解下HttpModule HttpHandlers。

1、如果你想通過*.aspx,*.html文件來處理程序邏輯,那么你需要使用HttpHandler,換句話說,httphandler是一個擴展的處理器。

2、如果你想使用ASP.NET管道來處理程序邏輯,你需要使用HttpModule 換句話說,httpmodule是一個事件處理器。

如何處理請求。mhpm有4個重要的步驟:

步驟1(M: HttpModule):客戶端開始請求處理。在asp.net引擎和httpmodule中的事件可以用來處理用戶自己定義的邏輯。有6個重要的事件,你可以在你的頁面對象被創建之前調用 Begin Requestauthenticaterequestauthorizerequestresolverequestcacheacquirerequeststateprerequesthandlerexecute

步驟2(H: ‘HttpHandler’):一旦上述6個事件被執行完,asp.net引擎調用processrequest事件,如果已實現httphandler在您的項目。

步驟3(P: ASP.NET page):一旦httphandler執行,asp.net頁面對象被創建。而asp.net頁面對象被創建,Page對象的事件將被調用,這可以幫助我們頁面中定制自定義邏輯的處理。有6個重要的事件,Init, Load, validate, event, render ,unload 簡稱 SILVER?? S – Start (does not signify anything as such just forms the word) , I – (Init) , L (Load) , V (Validate), E (Event) and R (Render)。
步驟4(M: HttpModule):一旦頁面對象是執行和從內存中卸載,httpmodule提供網頁執行事件可以用來注入自定義處理邏輯。有4個重要的后處理事件postrequesthandlerexecutereleaserequeststateupdaterequestcacheendrequest

事件詳細介紹:

部分Event事件Description描述
HttpModuleBeginRequest在 ASP.NET 響應請求時作為 HTTP 執行線鏈中的第一個事件發生。BeginRequest 事件發出信號表示創建任何給定的新請求。此事件始終被引發,并且始終是請求處理期間發生的第一個事件。
HttpModuleAuthenticateRequest當安全模塊已建立用戶標識時發生。AuthenticateRequest 事件發出信號表示配置的身份驗證機制已對當前請求進行了身份驗證。
HttpModuleAuthorizeRequest安全模塊已驗證用戶授權時發生。AuthorizeRequest 事件發出信號表示 ASP.NET 已對當前請求進行了授權。
HttpModuleResolveRequestCache在 ASP.NET 完成授權事件以使緩存模塊從緩存中為請求提供服務后發生,從而繞過事件處理程序(例如某個頁或 XML Web services)的執行。
HttpModuleAcquireRequestState當 ASP.NET 獲取與當前請求關聯的當前狀態(如會話狀態)時發生。AcquireRequestState 事件在創建了事件處理程序之后引發。
HttpModulePreRequestHandlerExecute恰好在 ASP.NET 開始執行事件處理程序(例如,某頁或某個 XML Web services)前發生。
HttpHandlerProcessRequestHttphandler邏輯被執行。 在本節中,我們會寫,需要將每頁擴展執行的邏輯。
PageInit

OnInit 方法執行創建 Page 實例所需的初始化和設置步驟。在頁生命周期的此階段中,頁中聲明的服務器控件都已初始化為默認狀態;但每個控件的視圖狀態尚未填充。Page_Init 階段中,頁中的控件不能訪問該頁的其他服務器控件,無論其他控件是子控件還是父控件。不一定會創建其他服務器控件,也不一定能夠訪問它們

PageLoadASP.NET控件完成加載,你寫的UI操作邏輯或任何其他邏輯在這里。
PageValidate如果你有你的頁面上有驗證邏輯,這里檢查是否符合驗證。
?Render將頁面最終的輸出發送到瀏覽器,如果你想做出一些最終的HTML的變化,這是輸出到瀏覽器,你可以在這里輸入你的HTML的邏輯。
PageUnload頁面對象從內存中卸載。
HttpModulePostRequestHandlerExecute在 ASP.NET 事件處理程序(例如,某頁或某個 XML Web service)執行完畢時發生。
HttpModuleReleaserequestState在 ASP.NET 執行完所有請求事件處理程序后發生。該事件將使狀態模塊保存當前狀態數據。引發 ReleaseRequestState 事件以后,應用程序以該請求結束,并發出 ASP.NET 信號以存儲該請求狀態。
HttpModuleUpdateRequestCacheBefore you end, if you want to update your cache.結束之前,如果您想更新您的高速緩存。
HttpModuleEndRequest當 ASP.NET 執行完事件處理程序以使緩存模塊存儲將用于從緩存為后續請求提供服務的響應時發生。

?

演示代碼:

? 在這段代碼中,我們創建HttpModule 和Httphandler? 添加所有請求響應的事件, 下面用 HttpModule Httphandler? 跟蹤所有活動,并把它添加到一個全局性的集合變量中。

public class clsHttpModule : IHttpModule{private HttpApplication httpApp;public static ArrayList objArrayList = new ArrayList();public clsHttpModule(){}public void Dispose(){}public void Init(HttpApplication context){this.httpApp = context;httpApp.Context.Response.Clear();objArrayList.Clear();objArrayList.Add("httpModule:Init");httpApp.AuthenticateRequest += new EventHandler(OnAuthentication);httpApp.AuthorizeRequest += new EventHandler(OnAuthorization);httpApp.BeginRequest += new EventHandler(OnBeginrequest);httpApp.EndRequest += new EventHandler(OnEndRequest);httpApp.ResolveRequestCache += new EventHandler(OnResolveRequestCache);httpApp.AcquireRequestState += new EventHandler(OnAcquireRequestState);httpApp.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);httpApp.PostRequestHandlerExecute += new EventHandler(OnPostRequestHandlerExecute);httpApp.ReleaseRequestState += new EventHandler(OnReleaseRequestState);httpApp.UpdateRequestCache += new EventHandler(OnUpdateRequestCache);}void OnUpdateRequestCache(object sender, EventArgs a){objArrayList.Add("httpModule:OnUpdateRequestCache");}void OnReleaseRequestState(object sender, EventArgs a){objArrayList.Add("httpModule:OnReleaseRequestState");}void OnPostRequestHandlerExecute(object sender, EventArgs a){objArrayList.Add("httpModule:OnPostRequestHandlerExecute");}void OnPreRequestHandlerExecute(object sender, EventArgs a){objArrayList.Add("httpModule:OnPreRequestHandlerExecute");}void OnAcquireRequestState(object sender, EventArgs a){objArrayList.Add("httpModule:OnAcquireRequestState");}void OnResolveRequestCache(object sender, EventArgs a){objArrayList.Add("httpModule:OnResolveRequestCache");}void OnAuthorization(object sender, EventArgs a){objArrayList.Add("httpModule:OnAuthorization");}void OnAuthentication(object sender, EventArgs a){objArrayList.Add("httpModule:AuthenticateRequest");}void OnBeginrequest(object sender, EventArgs a){objArrayList.Add("httpModule:BeginRequest");}void OnEndRequest(object sender, EventArgs a){objArrayList.Add("httpModule:EndRequest");objArrayList.Add("<hr>");foreach (string str in objArrayList){httpApp.Context.Response.Write(str + "<br>");}}}

webconfig中配置:

  <httpModules><add name="clsHttpModule" type="WebDemo1.Common.clsHttpModule"/></httpModules>

頁面第一次加載效果:

點擊button按鈕后:

HttpModule

HttpModule通過在某些事件中注冊,把自己插入ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對相應的HTTP模塊,這樣該模塊就能處理請求了。

常用操作:

1、向每個頁面動態添加一些備注或說明性的文字:
2、判斷用戶登錄

如果定義了多個HttpModule,在web.config文件中引入自定義HttpModule的順序就決定了多個自定義HttpModule在處理一個HTTP請求的接管順序。

HttpHandler
HttpHandler是HTTP請求的處理中心,真正地對客戶端請求的服務器頁面做出編譯和執行,并將處理過后的信息附加在HTTP請求信息流中再次返回到HttpModule中。
HttpHandler與HttpModule不同,一旦定義了自己的HttpHandler類,那么它對系統的HttpHandler的關系將是“覆蓋”關系。

為了驗證請求是否進入HttpHandler ,我們可以在WebConfig中 加入:

<add verb="*" path="*.aspx" type="WebDemo1.Common.clsHttpHandler,WebDemo1"/>

調試程序看看。

綜上我們可以總計出一張圖:

ASP.NET頁面事件

???? 在上面的部分,我們已經看到了一個ASP.NET頁面完整的請求事件。 最重要的部分之一,是ASP.NET頁面,我們沒有詳細討論相同。我們詳細討論下ASP.NET的頁面事件。任何ASP.NET頁面中有2個部分 如圖:

注意 :大部分的開發者直接使用page_load方法的一切,這不是一個好的做法。例如 填充控件,設置視圖狀態,應用主題等,這些都是發生在頁面上的負荷。因此,我們可以在適當的事件,添加適當的邏輯,這將真正使你的代碼整潔 符合邏輯。

序號
事件
控件初始化
狀態 是否
可用
表單數據是否
可用
什么邏輯可以寫在這里?

1
Init
No
No
No

OnInit 方法執行創建 Page 實例所需的初始化和設置步驟。在頁生命周期的此階段中,頁中聲明的服務器控件都已初始化為默認狀態;但每個控件的視圖狀態尚未填充。在 Page_Init 階段中,頁中的控件不能訪問該頁的其他服務器控件,無論其他控件是子控件還是父控件。不一定會創建其他服務器控件,也不一定能夠訪問它們。

2
Load view state
Not guaranteed
Yes
Not guaranteed
您可以訪問視圖狀態和任何同步邏輯

3
PostBackdata
Not guaranteed
Yes
Yes
你可以訪問表單數據。

4
Load
Yes
Yes
Yes
綁定控件 等等。。。

5
Validate
Yes
Yes
Yes
如果你的頁面有驗證,或者你想為您的網頁執行驗證。

6
Event
Yes
Yes
Yes
如果這是通過點擊一個按鈕或下拉的變化,那么相對應的事件將被執行。

7
Pre-render
Yes
Yes
Yes
如果你想在這些控件視圖狀態最后保存之前修改UI對象的結構或屬性值。

8
Save view state
Yes
Yes
Yes
一旦所有服務器控件的變化完成,這一事件控制數據保存在視圖狀態。

9
Render
Yes
Yes
Yes
如果你想添加一些自定義的HTML輸出。

10
Unload
Yes
Yes
Yes

你可以在這里做任何清理。

?

【轉自】https://www.cnblogs.com/suizhouqiwei/archive/2012/08/15/2637775.html

轉載于:https://www.cnblogs.com/bad-man/p/7988826.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于PCL的ICP及其變種算法實現

文章目錄前言一、ICP算法基礎1.1 提取待匹配點對1.2 計算旋轉平移矩陣1.3 計算變換后的點和目標點之間的偏差二、ICP算法變種2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 傳統方法2. PointToPlane ICP總結前言 ICP&#xff08;Iterative Closest Point&am…

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串&#xff08;Longest CommonSubstring&#xff09;和最長公共子序列&#xff08;LongestCommon Subsequence, LCS&#xff09;的區別&#xff1a;子串&#xff08;Substring&#xff09;是串的一個連續的部分&#xff0c;子序列&#xff08;Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個&#xff1a;①重新定義了一塊空間用于存儲數據&#xff1b;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中&#xff0c;程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的&#xff1a; public static …

基于PCL的MLS(移動最小二乘)算法簡介與示例

一、MLS基礎 mls算法本質上和最小二乘一樣&#xff0c;是一種擬合數據的算法。區別在于mls是局部的&#xff0c;即通過系數向量和基函數分別對數據中不同位置的節點區域進行擬合&#xff0c;需要計算出全部節點域的擬合函數的參數。而傳統的最小二乘是全局的&#xff0c;采用所…

二分法php

二分法。分別使用while循環的方法和遞歸調用的方法。 <?php// 二分法的使用數組必須是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 遞歸調用&#xff08;相比較好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…

【JZOJ4861】【NOIP2016提高A組集訓第7場11.4】推冰塊

題目描述 Dpstr最近迷上了推冰塊。冰地是一個n行m列的網格區域&#xff0c;第i行第j列的格子記為(i,j)&#xff0c;也就是左上角為(1,1)&#xff0c;右下角為(n,m)。每個格子可能是冰面、障礙物、減速帶三者之一。其中&#xff0c;冰地外圍&#xff08;即第0行、第n1行、第0列、…

【圖像處理面試題】——1

鏈接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、給定0-1矩陣&#xff0c;求連通域。2、寫一個函數&#xff0c;求灰度圖的直方圖。3、寫一個均值濾波&#xff08;中值濾波&#xff09;。4、寫出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT運維服務管理問題總結 #F#

1.管理現狀問題&#xff1a;支撐企業業務運行的IT系統主要由大量的網絡設備、主機系統和應用系統組成&#xff0c;這些設備和系統從應用角度來分又屬于不同的業務系統和部門&#xff0c;網絡設備、主機系統等具備獨立的用戶管理、認證授權和審計系統&#xff0c;且由不同的系統…

基于PCL的RANSAC(隨機采樣一致)算法簡介與示例

前言 RANSAC&#xff08;Random sample consensus&#xff0c;隨機采樣一致&#xff09;是3D點云擬合的一種重要的手段&#xff0c;可以對直線、圓、平面&#xff0c;圓球、圓柱等形狀的點云進行擬合&#xff0c;其優點在于可以最大程度上減少噪聲點對擬合效果的影響。 一、RA…

MATLAB調用Python自定義函數(類、函數等) Python調用MATLAB

一、MATLAB調用Python函數 參考鏈接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎鏈接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上這位說的更加的詳細&#xff0c;感謝 二、Python調用MATLAB-API 知乎鏈接&#xff1a;htt…

Testin云測與ARM 戰略合作:推動全球移動應用加速進入中國市場

Testin云測與ARM 戰略合作&#xff1a;推動全球移動應用加速進入中國市場 2014/10/14 Testin 業界資訊&#xff08;中國北京–2014年10月14日 &#xff09;全球最大的移動游戲、應用真機和用戶云測試平臺Testin云測今日宣布與ARM建立戰略伙伴合作關系&#xff0c;設立“ARM應…

iOS:真機調試

真機調試現在發生了改變&#xff0c;在Xcode7以前進行真機調試是需要證書的&#xff0c;正是由于這個原因&#xff0c;這個過程比較麻煩&#xff1b;在Xcode7以后是免證書的&#xff0c;使用起來就簡單很多了。 Xcode7以前的步驟如下&#xff1a; 原鏈接地址為&#xff1a;http…

正則表達式快速入門,轉載

正則表達式快速入門 首先簡單介紹下正則表達式&#xff1a; 在編寫處理字符串的程序或網頁時&#xff0c;經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用于描述這些規則的工具。換句話說&#xff0c;正則表達式就是記錄文本規則的代碼。 下面就看看正則表達式里…

C++總結筆記(十三)—— 類型轉換

文章目錄一、類型轉換簡介二、示例1.隱式類型轉換2.強制類型轉換一、類型轉換簡介 C中類型轉換從形式上可分為顯式和隱式兩種。 隱式類型轉換則是由編譯器自動完成類型轉換過程&#xff0c;可以分為內置數據類型轉換和自定義數據類型轉換。 顯式的類型轉換通常使用強制類型轉…

【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件轉py文件及no Qt platform plugin could be initialized 問題解決】

目錄 一、尋找designer.exe 二、no Qt platform plugin could be initialized 問題解決 三、ui文件轉換為py文件 四、pyqt5的使用教程 一、尋找designer.exe 頭疼&#xff0c;找了一上午都沒有找到這個的路徑&#xff0c;最后還是在評論區看到的&#xff0c;這也不能怪人家…

mysql語句大全

1、說明&#xff1a;創建數據庫CREATE DATABASE database-name2、說明&#xff1a;刪除數據庫drop database dbname3、說明&#xff1a;備份sql server--- 創建 備份數據的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 開始 備份B…

【翻譯】在Ext JS和Sencha Touch中創建自己定義布局

原文&#xff1a;Creating Custom Layouts in Ext JS and Sencha Touch布局系統是Sencha框架中最強大和最獨特的一部分。布局會處理應用程序中每個組件的大小和位置&#xff0c;因而&#xff0c;不須要手動去管理那些碎片。Ext JS與Sencha Touch的布局類有很多類似之處。近期在…

PCL中GreedyProjection三角化算法簡介與示例

文章目錄前言一、PCL點云三角化1.1 Delaunay三角剖分1.2 貪婪三角化二、程序示例總結前言 Delaunay三角剖分最初應用于2維領域&#xff0c;而與Greedy三角化算法的結合&#xff0c;使之成為目前在三維重建領域最為基礎的算法原理之一&#xff0c;很多學者針對其原理進行改進用…