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_ ...
随机推荐
- itest(爱测试) 4.4.0 发布,开源BUG 跟踪管理 & 敏捷测试管理软件
itest 简介 test 开源敏捷测试管理,testOps 践行者.可按测试包分配测试用例执行,也可建测试迭代(含任务,测试包,BUG)来组织测试工作,也有测试环境管理,还有很常用的测试度量:对于发 ...
- 纪中20日c组T2 2122. 【2016-12-31普及组模拟】幸运票
2122. 幸运票 (File IO): input:tickets.in output:tickets.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto P ...
- 【sklearn文本特征提取】词袋模型/稀疏表示/停用词/TF-IDF模型
1. 词袋模型 (Bag of Words, BOW) 文本分析是机器学习算法的一个主要应用领域.然而,原始数据的这些符号序列不能直接提供给算法进行训练,因为大多数算法期望的是固定大小的数字特征向量, ...
- Uva1660 (点联通度、边联通度问题)
题意: 给定一个n(n<=50)的无向图,问最小删去几个点,可以使得这个图不连通 解法: 1. 基本概念 (1)一个具有 N 个顶点的图,在去掉任意 K-1 个顶点后 (1<=K&l ...
- MySQL 8 服务器组件
MySQL 服务器包含了一个基于组件的架构,用于扩展服务器功能.服务器和其他组件可以使用组件提供的服务.(在使用服务方面,服务器也是一个组件,等同于其他组件).组件之间交互仅通过他们各自提供的服务. ...
- JavaSE学习笔记(3)---面向对象三大特性
JavaSE学习笔记(3)---面向对象三大特性 面向对象的三大特征:继承.封装.多态 1.封装 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改.然 ...
- 【pattern】设计模式(1) - 单例模式
前言 好久没写博客,强迫自己写一篇.只是总结一下自己学习的单例模式. 说明 单例模式的定义,摘自baike: 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):“保证一个类 ...
- 牛客寒假6-F十字阵列
链接:https://ac.nowcoder.com/acm/problem/201986来源:牛客网 题目描述 小 Q 新学会了一种魔法,可以对一个 N行M列 的网格上的敌人造成伤害 第 i 次使用 ...
- Spring学习-依赖注入
Spring是基于IOC与AOP的框架,而其中的IOC(Inversion of Control)即反转控制是Spring的基础. 在以前学过的知识中,一个新的对象全部为自己手动new出来的,而在Sp ...
- 【你不知道的javaScript 中卷 笔记2】javaScript中的类型转换
1.1 对象内部属性 [[Class]] 常见的原生函数: String() Number() Boolean() Array() Object() Function() RegExp() Date( ...