HttpApplication处理管道处理过程简单描述
HttpApplication对象是由Asp.net帮助我们创建的,它是asp.net中处理请求的重要对象。为了便于扩展,HttpApplication采用处理管道的方式进行处理,将处理的步骤分为多个步骤,每个步骤通过事件的形式暴露给程序员,这些事件按照固定的处理顺序依次触发,程序员通过编写事件处理方法就可以定义一个请求的扩展过程。
对于HttpApplication,到ASP.NET 4.0,提供了19个标准事件。
1.BeginRequest:asp.net开始处理请求的第一个事件,表示处理的开始。
2.AuthenticateRequest:验证请求,一般用来取得请求的用户信息。
3.PostAuthenticateRequest:已经获取请求的用户信息。
4.AuthorizeRequest:授权,一般用来检查用户的请求是否获得权限。
5.PostAuthorizeRequest:用户请求已经获得授权。
6.ResolveRequestCache:获取以前处理缓存的处理结果,如果以前缓存过,那么,不用再进行请求的处理工作,直接返回缓存的结果。
7.PostResolveRequestCache:已经完成缓存的处理工作。
8.PostMapRequestHandler:已经根据用户的请求,创建了请求的处理器对象。
9.AcquireRequestState:取得请求的状态,一般用于session
10.PostAcquireRequestState:已经获得了session
11.PreRequestHandlerExecute:准备执行处理程序。
12.PostRequestHandlerExecute:已经执行了处理程序
13.ReleaseRequestState:释放请求的状态。
14.PostReleaseRequestState:已经释放了请求的状态。
15.UpdateRequestCache:更新缓存。
16.PostUpdateRequestCache:已经更新了缓存。
17.LogRequest:请求的日志操作
18.PostLogRequest:已经完成请求的日志操作。
19.EndRequest:本次请求处理完成。
在asp.net中,asp.net服务器对每次请求的处理过程都是相同的,都要经过HttpApplication的处理管道。管道内的处理过程是固定的,在服务器处理请求的各个阶段,伴随着处理的进行,依次触发对应的事件,便于程序员,在不同的阶段完成自定义的处理工作。
一次请求到来,首先触发的事件是BeginRequest,这是服务器处理工作开始的第一个事件。
开始处理请求后,第一个重要的工作就是确定用户的身份,以实现安全机制。这个工作通过AuthenticateRequest和PostAuthenticateRequest两个事件提供检查当前用户的身份。AuthenticateRequest事件表示开始检查用户的身份,而PostAuthenticateRequest表示用户身份检查完成。检查后的用户可以通过HttpContext的User属性获得。这个属性的类型为System.Security.Principal.IPrincipal,IPrincipal又有一个类型为System.Security.Principal.IIdentity的属性,IIdentity有一个bool类型的属性IsAuthenticated,表示当前用户是否已经被验证。如果该属性为false,则表明当前请求的用户为一个匿名用户,否则,通过IIdentity类型为string的Name属性,可以获得当前用户的用户名。
当asp.net获取用户身份后,根据用户身份,开始校验请求的权限工作,当第4个事件AuthorizeRequest触发的时候,表示开始进行用户的权限检查,而第5个事件PostAuthorizeRequest则标志已经完成用户权限的检查工作。如果用户没有通过安全检查,一般情况下,将跳过剩下的事件,直接触发最后一个事件EndRequest结束请求的处理过程。
当用户获得了请求权限,那么服务器开始准备用最快的方法来使用户得到相应的结果,ResolveRequestCache事件标志着到从前的缓存的结果中进行检查,看是否可以直接从以前的缓存的结果中直接取得处理的结果,PostResolveRequestCache表示完成缓存检查。
如果缓存中没有结果的时候,则必须通过一次处理来计算出当前请求的结果。在asp.net中,用于处理请求以得到结果的对象成为处理程序Handler,在asp.net中,提供了很多的处理程序,程序员也可以自定义处理程序。为了处理这个请求,asp.net必需按照匹配规则找到一个处理当前请求的处理程序,PostMapRequestHandler事件表示已经取得了这个处理程序,HttpContext的Handler属性就表示这个处理程序对象。从上面分析可知,HttpContext的Handler属性到这里才有实际的意义。
得到了处理程序之后,还不能马上进行处理,这是由于处理请求还需要许多与这个请求有关的数据。比如说,这个用户在上一次向服务器发送请求的时候,在服务器上已经保存了一些这个用户的特有数据。从asp时代开始,Session这个概念在web中就已经出现,提供了基于会话的状态管理,由于http协议的无状态性,状态管理成了web开发中的一个核心的问题。
为了获取这个用户之前保存的专有数据,AcquireRequestState事件提供了一个切入点,PostAcquireRequestState事件则表示已经完成了用户数据的获取工作,可以在处理中使用了。
一切准备就绪,PreRequestHandlerExecute事件用来通知我们,处理程序就要开始进行处理工作了,如果在用户的状态已经获取之后,还有需要在程序处理之前进行的工作,那么就在这个事件中进行处理。
在PreRequestHandlerExecute事件之后,asp.net服务器将通过执行处理程序完成请求的处理工作,这个处理程序可能是一个web窗体,也可能是一个web服务,这个工作将在第11个和12事件之间完成。
处理程序完成之后,服务器进行扫尾工作,PostRequestHandlerExecute事件通知我们,asp.net服务器的处理工作已经完成。
在处理完成之后,由于在处理程序中,用户可能修改了用户特定的专有数据,那么,修改之后的用户状态数据可能需要进行序列化或者保存处理。ReleaseRequestState事件通知我们释放这些状态数据,PostReleaseRequestState事件则表示状态释放完成。
在处理完成之后,如果希望将这次处理结果缓存起来,以便于在后继的请求中可以直接使用这个结果,UpdateRequestCache事件提供了处理机会,PostUpdateRequestCache表示更新缓存完成。
在asp.net 4.0中,新增了2个事件用来处理日志工作,LogRequest表示这次请求记入日志中,PostLogRequest表示完成了日志的记录。
一次请求,并不一定经过所有的时间,比如说,用户没有经过授权检查,那么将跳过后面的事件,但EndRequest事件是所有请求都要经过的最后一个事件。这个事件之后,服务器将处理结果返回浏览器,完成服务器的处理工作。
HttpApplication处理管道处理过程简单描述的更多相关文章
- HttpApplication的处理管道处理过程简单描述
在asp.net中,asp.net服务器对每次请求的处理过程都是相同的,都要经过HttpApplication的处理管道.管道内的处理过程是固定的,在服务器处理请求的各个阶段,伴随着处理的进行,依次触 ...
- android开机过程简单描述
1 开机引导bootloader,相当于电脑开机启动bios 2 引导过后可以进入三种模式:fastboot, recovery, linux kernel.前两种跟版本升级相关,正常开机进入linu ...
- 简单描述RAID级别:
简单描述RAID级别: RAID 0 是俩盘一起读写,如果一个坏了那么数据全丢失: RAID 1是一块写,一块用来备份,坏一块无所谓: RAID 2 ,3 ,4 不常用: 最常用的就是RAID 5和R ...
- HttpApplication 对象的创建过程及HttpModule过滤器的内部实现过程
最近通过Reflector学习了一下asp.net内部的原理,做做笔记,方便以后查阅. 先看下HttpApplication 对象的创建过程 从IHttpHandler applicationInst ...
- Java中会存在内存泄露吗?请简单描述。
本文转载自:Java中会存在内存泄漏吗,请简单描述 会.java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周 ...
- Asp.net MVC进入请求管道的过程
Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...
- Asp.Net HttpApplication请求管道与Session(二)
Asp.Net 回话的创建与结束 LogHelper.LogHelper _log = new LogHelper.LogHelper(); /// <summary> /// 程序开始- ...
- Asp.Net HttpApplication请求管道与Session(一)
1.请求处理顺序执行事件 /********************请求处理顺序执行事件**********************/ /// <summary> /// 请求入站 /// ...
- ECSHOP购物车页面显示商品简单描述
1.这里说的商品简单描述,不是商品的详细信息,而是后台编辑商品时在“其他信息”标签栏填写的那个“商品简单描述”,即goods_brief字段 2.修改lib_order.php文件的get_cart_ ...
随机推荐
- postgresql开篇
postgresql 作为官方号称的最先进的开源数据库,从今天(2020-1-19)起开始系统的学习一下,记录自己学习的点点滴滴.
- 一、threejs————灯光阴影
threejs设置阴影有三个注意点 1.只有支持阴影的灯光才可以 pointLight,spotlight,directionallight 2.添加摄像机辅助器 THREE.CameraHelper ...
- linux 磁盘管理2-硬盘分区
不重启添加硬盘. echo '- - -' > /sys/class/scsi_host/host2/scan #centos7有效 列出块设备 lsblk 显示块设备列表 ...
- C# WPF聊天界面(3/3)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF聊天界面(3/3) 阅读导航 本文背景 代码实现 本文参考 1.本文背景 系列文章 ...
- 洛谷P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 使用四种算法
洛谷P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 水题一道…… 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. ...
- 将小账本上传到GitHub
在假期的时候我已经注册好了用户 https://www.cnblogs.com/1234yyf/p/12312072.html 然后我将我的小账本上传到GitHub上面:一步一步跟着就可以上传成功!! ...
- Elasticsearch集成IKAnalyzer分析器
1. 查看标准分析器的分词结果 http://127.0.0.1:9200/_analyze?analyzer=standard&text=标准分析器 都分成了单个汉字, ...
- H5_0021:判断平台和微信
1,跳网站: <script>eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c ...
- 【学习笔记】:一天搞定HTML
PS:许多控制样式的标签在HTML5中都不推荐使用,建议使用CSS,如align,border等. 一.概念 HTML的英文全称:Hypertext Marked Language 超文本标记语言. ...
- 白面系列 docker
在讲docker之前,首先区分2个概念,容器和虚拟机. 容器: 虚拟机: 简单来说,容器虚拟化操作系统:虚拟机虚拟化硬件. 容器粒度更小更灵活:虚拟机包含资源更多更大. docker就是用来做容器化的 ...