【转载】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.mzph.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;很多学者针对其原理进行改进用…