ASPNET应用程序与页面生命周期.docx
《ASPNET应用程序与页面生命周期.docx》由会员分享,可在线阅读,更多相关《ASPNET应用程序与页面生命周期.docx(22页珍藏版)》请在冰豆网上搜索。
ASPNET应用程序与页面生命周期
ASP.NET应用程序与页面生命周期
在本文中,我们将了解不同的事件,ASP.NET应用程序的生命周期以浏览器向Web服务器(对于ASP.NET应用程序,通常为IIS)发送请求为起点,直至将请求结果返回至浏览器结束。
在这个过程中,首先我们需要了解ASP.NET请求的2个大致的步骤。
其次我们将详细了解'httphandler','httpmodule和页面对象(Page)中不同的事件的执行顺序,逻辑。
二个步骤的过程:
请求处理,2步的过程如下所示,用户发送一个请求到IIS服务器:
1、创建一个运行时,可以处理请求。
换句话说,它创建应用程序对象,请求,响应和上下文对象处理请求。
2、运行时一旦被创建,请求处理,通过一系列的事件处理模块,Handler处理和页面对象。
简称MHPM(Module,handler,pageandModuleevent)。
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,pageandModuleevent)。
使用MHPM(Module,handler,pageandModuleevent)事件处理请求
一旦HttpApplication对象创建,在处理该请求时将由HttpApplication类执行。
我们来了解下HttpModuleHttpHandlers。
1、如果你想通过*.aspx,*.html文件来处理程序逻辑,那么你需要使用HttpHandler,换句话说,httphandler是一个扩展的处理器。
2、如果你想使用ASP.NET管道来处理程序逻辑,你需要使用HttpModule换句话说,httpmodule是一个事件处理器。
如何处理请求。
mhpm有4个重要的步骤:
步骤1(M:
HttpModule):
客户端开始请求处理。
在引擎和httpmodule中的事件可以用来处理用户自己定义的逻辑。
有6个重要的事件,你可以在你的页面对象被创建之前调用BeginRequest,authenticaterequest,authorizerequest,resolverequestcache,acquirerequeststate与prerequesthandlerexecute。
步骤2(H:
‘HttpHandler’):
一旦上述6个事件被执行完,引擎调用processrequest事件,如果已实现httphandler在您的项目。
步骤3(P:
ASP.NETpage):
一旦httphandler执行,页面对象被创建。
而页面对象被创建,Page对象的事件将被调用,这可以帮助我们页面中定制自定义逻辑的处理。
有6个重要的事件,Init,Load,validate,event,render ,unload简称SILVER S–Start(doesnotsignifyanythingassuchjustformstheword),I–(Init),L(Load),V(Validate),E(Event)andR(Render)。
步骤4(M:
HttpModule):
一旦页面对象是执行和从内存中卸载,httpmodule提供网页执行事件可以用来注入自定义处理逻辑。
有4个重要的后处理事件postrequesthandlerexecute,releaserequeststate,updaterequestcache与endrequest。
事件详细介绍:
部分
Event事件
Description描述
HttpModule
BeginRequest
在ASP.NET响应请求时作为HTTP执行管线链中的第一个事件发生。
BeginRequest事件发出信号表示创建任何给定的新请求。
此事件始终被引发,并且始终是请求处理期间发生的第一个事件。
HttpModule
AuthenticateRequest
当安全模块已建立用户标识时发生。
AuthenticateRequest事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。
HttpModule
AuthorizeRequest
安全模块已验证用户授权时发生。
AuthorizeRequest事件发出信号表示ASP.NET已对当前请求进行了授权。
HttpModule
ResolveRequestCache
在ASP.NET完成授权事件以使缓存模块从缓存中为请求提供服务后发生,从而绕过事件处理程序(例如某个页或XMLWebservices)的执行。
HttpModule
AcquireRequestState
当ASP.NET获取与当前请求关联的当前状态(如会话状态)时发生。
AcquireRequestState事件在创建了事件处理程序之后引发。
HttpModule
PreRequestHandlerExecute
恰好在ASP.NET开始执行事件处理程序(例如,某页或某个XMLWebservices)前发生。
HttpHandler
ProcessRequest
Httphandler逻辑被执行。
在本节中,我们会写,需要将每页扩展执行的逻辑。
Page
Init
OnInit方法执行创建Page实例所需的初始化和设置步骤。
在页生命周期的此阶段中,页中声明的服务器控件都已初始化为默认状态;但每个控件的视图状态尚未填充。
在Page_Init阶段中,页中的控件不能访问该页的其他服务器控件,无论其他控件是子控件还是父控件。
不一定会创建其他服务器控件,也不一定能够访问它们
Page
Load
ASP.NET控件完成加载,你写的UI操作逻辑或任何其他逻辑在这里。
Page
Validate
如果你有你的页面上有验证逻辑,这里检查是否符合验证。
Render
将页面最终的输出发送到浏览器,如果你想做出一些最终的HTML的变化,这是输出到浏览器,你可以在这里输入你的HTML的逻辑。
Page
Unload
页面对象从内存中卸载。
HttpModule
PostRequestHandlerExecute
在ASP.NET事件处理程序(例如,某页或某个XMLWebservice)执行完毕时发生。
HttpModule
ReleaserequestState
在ASP.NET执行完所有请求事件处理程序后发生。
该事件将使状态模块保存当前状态数据。
引发ReleaseRequestState事件以后,应用程序以该请求结束,并发出ASP.NET信号以存储该请求状态。
HttpModule
UpdateRequestCache
Beforeyouend,ifyouwanttoupdateyourcache.结束之前,如果您想更新您的高速缓存。
HttpModule
EndRequest
当ASP.NET执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生。
演示代码:
在这段代码中,我们创建HttpModule和Httphandler 添加所有请求响应的事件,下面用HttpModuleHttphandler 跟踪所有活动,并把它添加到一个全局性的集合变量中。
1publicclassclsHttpModule:
IHttpModule
2{
3privateHttpApplicationhttpApp;
4publicstaticArrayListobjArrayList=newArrayList();
5publicclsHttpModule()
6{
7
8}
9
10
11publicvoidDispose()
12{
13
14}
15
16publicvoidInit(HttpApplicationcontext)
17{
18this.httpApp=context;
19httpApp.Context.Response.Clear();
20objArrayList.Clear();
21objArrayList.Add("httpModule:
Init");
22httpApp.AuthenticateRequest+=newEventHandler(OnAuthentication);
23httpApp.AuthorizeRequest+=newEventHandler(OnAuthorization);
24httpApp.BeginRequest+=newEventHandler(OnBeginrequest);
25httpApp.EndRequest+=newEventHandler(OnEndRequest);
26httpApp.ResolveRequestCache+=newEventHandler(OnResolveRequestCache);
27httpApp.AcquireRequestState+=newEventHandler(OnAcquireRequestState);
28httpApp.PreRequestHandlerExecute+=newEventHandler(OnPreRequestHandlerExecute);
29httpApp.PostRequestHandlerExecute+=newEventHandler(OnPostRequestHandlerExecute);
30httpApp.ReleaseRequestState+=newEventHandler(OnReleaseRequestState);
31httpApp.UpdateRequestCache+=newEventHandler(OnUpdateRequestCache);
32}
33voidOnUpdateRequestCache(objectsender,EventArgsa)
34{
35objArrayList.Add("httpModule:
OnUpdateRequestCache");
36}
37voidOnReleaseRequestState(objectsender,EventArgsa)
38{
39objArrayList.Add("httpModule:
OnReleaseRequestState");
40}
41voidOnPostRequestHandlerExecute(objectsender,EventArgsa)
42{
43objArrayList.Add("httpModule:
OnPostRequestHandlerExecute");
44}
45voidOnPreRequestHandlerExecute(objectsender,EventArgsa)
46{
47objArrayList.Add("httpModule:
OnPreRequestHandlerExecute");
48}
49voidOnAcquireRequestState(objectsender,EventArgsa)
50{
51objArrayList.Add("httpModule:
OnAcquireRequestState");
52}
53voidOnResolveRequestCache(objectsender,EventArgsa)
54{
55objArrayList.Add("httpModule:
OnResolveRequestCache");
56}
57voidOnAuthorization(objectsender,EventArgsa)
58{
59objArrayList.Add("httpModule:
OnAuthorization");
60}
61voidOnAuthentication(objectsender,EventArgsa)
62{
63
64objArrayList.Add("httpModule:
AuthenticateRequest");
65}
66voidOnBeginrequest(objectsender,EventArgsa)
67{
68
69objArrayList.Add("httpModule:
BeginRequest");
70}
71voidOnEndRequest(objectsender,EventArgsa)
72{
73objArrayList.Add("httpModule:
EndRequest");
74objArrayList.Add("
");
75foreach(stringstrinobjArrayList)
76{
77httpApp.Context.Response.Write(str+"
");
78}
79
80}
81
82}
以下代码片段是跟踪HttpHandler的ProcessRequest'事件':
1publicclassclsHttpHandler:
IHttpHandler
2{
3
4publicboolIsReusable
5{
6get{returntrue;}
7}
8
9publicvoidProcessRequest(HttpContextcontext)
10{
11clsHttpModule.objArrayList.Add("HttpHandler:
ProcessRequest");
12context.Response.Redirect("~/Default.aspx");
13}
14}
页面Page事件
1publicpartialclass_Default:
System.Web.UI.Page
2{
3protectedvoidPage_init(objectsender,EventArgse)
4{
5clsHttpModule.objArrayList.Add("Page:
Init");
6}
7protectedvoidPage_Load(objectsender,EventArgse)
8{
9clsHttpModule.objArrayList.Add("Page:
Load");
10}
11publicoverridevoidValidate()
12{
13clsHttpModule.objArrayList.Add("Page:
Validate");
14}
15protectedvoidButton1_Click(objectsender,EventArgse)
16{
17clsHttpModule.objArrayList.Add("Page:
Event");
18}
19protectedoverridevoidRender(HtmlTextWriteroutput)
20{
21clsHttpModule.objArrayList.Add("Page:
Render");
22base.Render(output);
23}
24protectedvoidPage_Unload(objectsender,EventArgse)
25{
26clsHttpModule.objArrayList.Add("Page:
UnLoad");
27}
28}
webconfig中配置:
HttpModules配置
1
2
3
页面第一次加载效果:
点击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中加入:
调试程序看看。
综上我们可以总计出一张图:
ASP.NET页面事件
在上面的部分,我们已经看到了一个ASP.NET页面完整的请求事件。
最重要的部分之一,是ASP.NET页面,我们没有详细讨论相同。
我们详细讨论下ASP.NET的页面事件。
任何ASP.NET页面中有2个部分如图:
注意:
大部分的开发者直接使用page_load方法的一切,这不是一个好的做法。
例如填充控件,设置视图状态,应用主题等,这些都是发生在页面上的负荷。
因此,我们可以在适当的事件,添加适当的逻辑,这将真正使你的代码整洁符合逻辑。
序号
事件
控件初始化
状态是否
可用
表单数据是否
可用
什么逻辑可以写在这里?
1
Init
No
No
No
OnInit方法执行创建 Page实例所需的初始化和设置步骤。
在页生命周期的此阶段中,页中声明的服务器控件都已初始化为默认状态;但每个控件的视图状态尚未填充。
在Page_Init阶段中,页中的控件不能访问该页的其他服务器控件,无论其他控件是子控件还是父控件。
不一定会创建其他服务器控件,也不一定能够访问它们。
2
Loadviewstate
Notguaranteed
Yes
Notguaranteed
您可以访问视图状态和任何同步逻辑
3
PostBackdata
Notguaranteed
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
Saveviewstate
Yes
Yes
Yes
一旦所有服务器控件的变化完成,这一事件控制数据保存在视图状态。
9
Render
Yes
Yes
Yes
如果你想添加一些自定义的HTML输出。
10
Unload
Yes
Yes
Yes
你可以在这里做任何清理。