日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ASP.NET应用程序与页面生命周期

發(fā)布時(shí)間:2025/4/14 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET应用程序与页面生命周期 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:http://www.cnblogs.com/suizhouqiwei/archive/2012/08/15/2637775.html

在本文中,我們將了解不同的事件,ASP.NET 應(yīng)用程序的生命周期以瀏覽器向 Web 服務(wù)器(對(duì)于 ASP.NET 應(yīng)用程序,通常為 IIS)發(fā)送請(qǐng)求為起點(diǎn),直至將請(qǐng)求結(jié)果返回至瀏覽器結(jié)束。在這個(gè)過(guò)程中,首先我們需要了解ASP.NET請(qǐng)求的2個(gè)大致的步驟。其次我們將詳細(xì)了解 'httphandler ',' httpmodule和 asp.net 頁(yè)面對(duì)象(Page)中不同的事件的執(zhí)行順序,邏輯。

二個(gè)步驟的過(guò)程:

asp.net請(qǐng)求處理,2步的過(guò)程如下所示,用戶發(fā)送一個(gè)請(qǐng)求到IIS 服務(wù)器:

1、asp.net創(chuàng)建一個(gè)運(yùn)行時(shí),可以處理請(qǐng)求。換句話說(shuō),它創(chuàng)建應(yīng)用程序?qū)ο?#xff0c;請(qǐng)求,響應(yīng)和上下文對(duì)象處理請(qǐng)求。

2、運(yùn)行時(shí)一旦被創(chuàng)建,請(qǐng)求處理,通過(guò)一系列的事件處理模塊,Handler處理和頁(yè)面對(duì)象。簡(jiǎn)稱MHPM (Module, handler, page and Module event)。

?

?

ASP.NET 應(yīng)用程序生命周期的各個(gè)階段:

步驟1:用戶從 Web 服務(wù)器請(qǐng)求應(yīng)用程序資源?ASP.NET 應(yīng)用程序的生命周期以瀏覽器向 Web 服務(wù)器(對(duì)于 ASP.NET 應(yīng)用程序,通常為 IIS)發(fā)送請(qǐng)求為起點(diǎn)。ASP.NET 是 Web 服務(wù)器下的 ISAPI 擴(kuò)展。Web 服務(wù)器接收到請(qǐng)求時(shí),會(huì)對(duì)所請(qǐng)求的文件的文件擴(kuò)展名進(jìn)行檢查,確定應(yīng)由哪個(gè) ISAPI 擴(kuò)展處理該請(qǐng)求,然后將該請(qǐng)求傳遞給合適的 ISAPI 擴(kuò)展。ASP.NET 處理已映射到其上的文件擴(kuò)展名,如 .aspx、.ascx、.ashx 和 .asmx。

?

步驟2:ASP.NET 接收對(duì)應(yīng)用程序的第一個(gè)請(qǐng)求?當(dāng) ASP.NET 接收到對(duì)應(yīng)用程序中任何資源的第一個(gè)請(qǐng)求時(shí),名為?ApplicationManager?的類會(huì)創(chuàng)建一個(gè)應(yīng)用程序域。應(yīng)用程序域?yàn)槿肿兞刻峁?yīng)用程序隔離,并允許單獨(dú)卸載每個(gè)應(yīng)用程序。在應(yīng)用程序域中,將為名為HostingEnvironment?的類創(chuàng)建一個(gè)實(shí)例,該實(shí)例提供對(duì)有關(guān)應(yīng)用程序的信息(如存儲(chǔ)該應(yīng)用程序的文件夾的名稱)的訪問(wèn)。

?

?

?

步驟3:為每個(gè)請(qǐng)求創(chuàng)建 ASP.NET 核心對(duì)象?創(chuàng)建了應(yīng)用程序域并對(duì)?HostingEnvironment?對(duì)象進(jìn)行了實(shí)例化之后,ASP.NET 將創(chuàng)建并初始化核心對(duì)象,如?HttpContext、HttpRequest?和?HttpResponse。HttpContext?類包含特定于當(dāng)前應(yīng)用程序請(qǐng)求的對(duì)象,如HttpRequest?和?HttpResponse?對(duì)象。HttpRequest?對(duì)象包含有關(guān)當(dāng)前請(qǐng)求的信息,包括 Cookie 和瀏覽器信息。HttpResponse?對(duì)象包含發(fā)送到客戶端的響應(yīng),包括所有呈現(xiàn)的輸出和 Cookie。

?

?步驟4:將?HttpApplication?對(duì)象分配給請(qǐng)求初始化所有核心應(yīng)用程序?qū)ο笾?#xff0c;將通過(guò)創(chuàng)建?HttpApplication?類的實(shí)例啟動(dòng)應(yīng)用程序。如果應(yīng)用程序具有 Global.asax 文件,則 ASP.NET 會(huì)創(chuàng)建 Global.asax 類(從?HttpApplication?類派生)的一個(gè)實(shí)例,并使用該派生類表示應(yīng)用程序

?第一次在應(yīng)用程序中請(qǐng)求 ASP.NET 頁(yè)或進(jìn)程時(shí),將創(chuàng)建?HttpApplication?的一個(gè)新實(shí)例。不過(guò),為了盡可能提高性能,可對(duì)多個(gè)請(qǐng)求重復(fù)使用?HttpApplication?實(shí)例。

?

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

?

?

?

?

?

?

使用MHPM (Module, handler, page and Module event) 事件處理請(qǐng)求?
一旦?HttpApplication對(duì)象創(chuàng)建,在處理該請(qǐng)求時(shí)將由?HttpApplication?類執(zhí)行。我們來(lái)了解下HttpModule?HttpHandlers。

1、如果你想通過(guò)*.aspx,*.html文件來(lái)處理程序邏輯,那么你需要使用HttpHandler,換句話說(shuō),httphandler是一個(gè)擴(kuò)展的處理器。

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

?

如何處理請(qǐng)求。mhpm有4個(gè)重要的步驟:

步驟1(M: HttpModule):客戶端開(kāi)始請(qǐng)求處理。在asp.net引擎和httpmodule中的事件可以用來(lái)處理用戶自己定義的邏輯。有6個(gè)重要的事件,你可以在你的頁(yè)面對(duì)象被創(chuàng)建之前調(diào)用?Begin Request,authenticaterequest,authorizerequest,resolverequestcache,acquirerequeststate與prerequesthandlerexecute。

?

步驟2(H: ‘HttpHandler’):一旦上述6個(gè)事件被執(zhí)行完,asp.net引擎調(diào)用processrequest事件,如果已實(shí)現(xiàn)httphandler在您的項(xiàng)目。

?

步驟3(P: ASP.NET page):一旦httphandler執(zhí)行,asp.net頁(yè)面對(duì)象被創(chuàng)建。而asp.net頁(yè)面對(duì)象被創(chuàng)建,Page對(duì)象的事件將被調(diào)用,這可以幫助我們頁(yè)面中定制自定義邏輯的處理。有6個(gè)重要的事件,Init,?Load,?validate,?event,?render?,unload 簡(jiǎn)稱?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):一旦頁(yè)面對(duì)象是執(zhí)行和從內(nèi)存中卸載,httpmodule提供網(wǎng)頁(yè)執(zhí)行事件可以用來(lái)注入自定義處理邏輯。有4個(gè)重要的后處理事件postrequesthandlerexecute,releaserequeststate,updaterequestcache與endrequest。

?

?

?事件詳細(xì)介紹:

部分Event事件Description描述
HttpModuleBeginRequest在 ASP.NET 響應(yīng)請(qǐng)求時(shí)作為 HTTP 執(zhí)行管線鏈中的第一個(gè)事件發(fā)生。BeginRequest?事件發(fā)出信號(hào)表示創(chuàng)建任何給定的新請(qǐng)求。此事件始終被引發(fā),并且始終是請(qǐng)求處理期間發(fā)生的第一個(gè)事件。
HttpModuleAuthenticateRequest當(dāng)安全模塊已建立用戶標(biāo)識(shí)時(shí)發(fā)生。AuthenticateRequest?事件發(fā)出信號(hào)表示配置的身份驗(yàn)證機(jī)制已對(duì)當(dāng)前請(qǐng)求進(jìn)行了身份驗(yàn)證。
HttpModuleAuthorizeRequest安全模塊已驗(yàn)證用戶授權(quán)時(shí)發(fā)生。AuthorizeRequest?事件發(fā)出信號(hào)表示 ASP.NET 已對(duì)當(dāng)前請(qǐng)求進(jìn)行了授權(quán)。
HttpModuleResolveRequestCache在 ASP.NET 完成授權(quán)事件以使緩存模塊從緩存中為請(qǐng)求提供服務(wù)后發(fā)生,從而繞過(guò)事件處理程序(例如某個(gè)頁(yè)或 XML Web services)的執(zhí)行。
HttpModuleAcquireRequestState當(dāng) ASP.NET 獲取與當(dāng)前請(qǐng)求關(guān)聯(lián)的當(dāng)前狀態(tài)(如會(huì)話狀態(tài))時(shí)發(fā)生。AcquireRequestState?事件在創(chuàng)建了事件處理程序之后引發(fā)。
HttpModulePreRequestHandlerExecute恰好在 ASP.NET 開(kāi)始執(zhí)行事件處理程序(例如,某頁(yè)或某個(gè) XML Web services)前發(fā)生。
HttpHandlerProcessRequestHttphandler邏輯被執(zhí)行。?在本節(jié)中,我們會(huì)寫(xiě),需要將每頁(yè)擴(kuò)展執(zhí)行的邏輯。
PageInit

OnInit?方法執(zhí)行創(chuàng)建?Page?實(shí)例所需的初始化和設(shè)置步驟。在頁(yè)生命周期的此階段中,頁(yè)中聲明的服務(wù)器控件都已初始化為默認(rèn)狀態(tài);但每個(gè)控件的視圖狀態(tài)尚未填充。在?Page_Init?階段中,頁(yè)中的控件不能訪問(wèn)該頁(yè)的其他服務(wù)器控件,無(wú)論其他控件是子控件還是父控件。不一定會(huì)創(chuàng)建其他服務(wù)器控件,也不一定能夠訪問(wèn)它們

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

?

演示代碼:

??在這段代碼中,我們創(chuàng)建HttpModule 和Httphandler? 添加所有請(qǐng)求響應(yīng)的事件, 下面用 HttpModule Httphandler? 跟蹤所有活動(dòng),并把它添加到一個(gè)全局性的集合變量中。

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>");}}}

?

以下代碼片段是跟蹤?HttpHandler?的ProcessRequest?'事件' :

public class clsHttpHandler : IHttpHandler{public bool IsReusable{get { return true; }}public void ProcessRequest(HttpContext context){clsHttpModule.objArrayList.Add("HttpHandler:ProcessRequest");context.Response.Redirect("~/Default.aspx");}}

?

頁(yè)面Page事件

public partial class _Default : System.Web.UI.Page{protected void Page_init(object sender, EventArgs e){clsHttpModule.objArrayList.Add("Page:Init");}protected void Page_Load(object sender, EventArgs e){clsHttpModule.objArrayList.Add("Page:Load");}public override void Validate(){clsHttpModule.objArrayList.Add("Page:Validate");}protected void Button1_Click(object sender, EventArgs e){clsHttpModule.objArrayList.Add("Page:Event");}protected override void Render(HtmlTextWriter output){clsHttpModule.objArrayList.Add("Page:Render");base.Render(output);}protected void Page_Unload(object sender, EventArgs e){clsHttpModule.objArrayList.Add("Page:UnLoad");}}

?

?webconfig中配置:

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

?

頁(yè)面第一次加載效果:

點(diǎn)擊button按鈕后:

HttpModule

HttpModule通過(guò)在某些事件中注冊(cè),把自己插入ASP.NET請(qǐng)求處理管道。當(dāng)這些事件發(fā)生的時(shí)候,ASP.NET調(diào)用對(duì)相應(yīng)的HTTP模塊,這樣該模塊就能處理請(qǐng)求了。

常用操作:

1、向每個(gè)頁(yè)面動(dòng)態(tài)添加一些備注或說(shuō)明性的文字:
2、判斷用戶登錄

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

?

HttpHandler
HttpHandler是HTTP請(qǐng)求的處理中心,真正地對(duì)客戶端請(qǐng)求的服務(wù)器頁(yè)面做出編譯和執(zhí)行,并將處理過(guò)后的信息附加在HTTP請(qǐng)求信息流中再次返回到HttpModule中。
HttpHandler與HttpModule不同,一旦定義了自己的HttpHandler類,那么它對(duì)系統(tǒng)的HttpHandler的關(guān)系將是“覆蓋”關(guān)系。

為了驗(yàn)證請(qǐng)求是否進(jìn)入HttpHandler ,我們可以在WebConfig中 加入:

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

?

調(diào)試程序看看。

?

綜上我們可以總計(jì)出一張圖:

?

?

ASP.NET頁(yè)面事件

???? 在上面的部分,我們已經(jīng)看到了一個(gè)ASP.NET頁(yè)面完整的請(qǐng)求事件。 最重要的部分之一,是ASP.NET頁(yè)面,我們沒(méi)有詳細(xì)討論相同。我們?cè)敿?xì)討論下ASP.NET的頁(yè)面事件。任何ASP.NET頁(yè)面中有2個(gè)部分 如圖:

注意?:大部分的開(kāi)發(fā)者直接使用page_load方法的一切,這不是一個(gè)好的做法。例如 填充控件,設(shè)置視圖狀態(tài),應(yīng)用主題等,這些都是發(fā)生在頁(yè)面上的負(fù)荷。因此,我們可以在適當(dāng)?shù)氖录?#xff0c;添加適當(dāng)?shù)倪壿?#xff0c;這將真正使你的代碼整潔 符合邏輯。

序號(hào)事件?控件初始化狀態(tài) 是否
可用
表單數(shù)據(jù)是否
可用
什么邏輯可以寫(xiě)在這里?
1InitNoNoNo

OnInit?方法執(zhí)行創(chuàng)建?Page 實(shí)例所需的初始化和設(shè)置步驟。在頁(yè)生命周期的此階段中,頁(yè)中聲明的服務(wù)器控件都已初始化為默認(rèn)狀態(tài);但每個(gè)控件的視圖狀態(tài)尚未填充。在?Page_Init?階段中,頁(yè)中的控件不能訪問(wèn)該頁(yè)的其他服務(wù)器控件,無(wú)論其他控件是子控件還是父控件。不一定會(huì)創(chuàng)建其他服務(wù)器控件,也不一定能夠訪問(wèn)它們。

2?Load view stateNot guaranteedYesNot guaranteed您可以訪問(wèn)視圖狀態(tài)和任何同步邏輯
3PostBackdataNot guaranteedYesYes?你可以訪問(wèn)表單數(shù)據(jù)。
4?LoadYesYesYes綁定控件 等等。。。
5?ValidateYesYesYes如果你的頁(yè)面有驗(yàn)證,或者你想為您的網(wǎng)頁(yè)執(zhí)行驗(yàn)證。
6EventYesYesYes如果這是通過(guò)點(diǎn)擊一個(gè)按鈕或下拉的變化,那么相對(duì)應(yīng)的事件將被執(zhí)行。
7?Pre-renderYesYesYes如果你想在這些控件視圖狀態(tài)最后保存之前修改UI對(duì)象的結(jié)構(gòu)或?qū)傩灾怠?/td>
8Save view stateYesYesYes一旦所有服務(wù)器控件的變化完成,這一事件控制數(shù)據(jù)保存在視圖狀態(tài)。
9?RenderYesYesYes如果你想添加一些自定義的HTML輸出。
10?UnloadYesYesYes

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

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/gavin-num1/p/5534276.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET应用程序与页面生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。