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处理管道处理过程简单描述的更多相关文章

  1. HttpApplication的处理管道处理过程简单描述

    在asp.net中,asp.net服务器对每次请求的处理过程都是相同的,都要经过HttpApplication的处理管道.管道内的处理过程是固定的,在服务器处理请求的各个阶段,伴随着处理的进行,依次触 ...

  2. android开机过程简单描述

    1 开机引导bootloader,相当于电脑开机启动bios 2 引导过后可以进入三种模式:fastboot, recovery, linux kernel.前两种跟版本升级相关,正常开机进入linu ...

  3. 简单描述RAID级别:

    简单描述RAID级别: RAID 0 是俩盘一起读写,如果一个坏了那么数据全丢失: RAID 1是一块写,一块用来备份,坏一块无所谓: RAID 2 ,3 ,4 不常用: 最常用的就是RAID 5和R ...

  4. HttpApplication 对象的创建过程及HttpModule过滤器的内部实现过程

    最近通过Reflector学习了一下asp.net内部的原理,做做笔记,方便以后查阅. 先看下HttpApplication 对象的创建过程 从IHttpHandler applicationInst ...

  5. Java中会存在内存泄露吗?请简单描述。

    本文转载自:Java中会存在内存泄漏吗,请简单描述 会.java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周 ...

  6. Asp.net MVC进入请求管道的过程

    Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...

  7. Asp.Net HttpApplication请求管道与Session(二)

    Asp.Net 回话的创建与结束 LogHelper.LogHelper _log = new LogHelper.LogHelper(); /// <summary> /// 程序开始- ...

  8. Asp.Net HttpApplication请求管道与Session(一)

    1.请求处理顺序执行事件 /********************请求处理顺序执行事件**********************/ /// <summary> /// 请求入站 /// ...

  9. ECSHOP购物车页面显示商品简单描述

    1.这里说的商品简单描述,不是商品的详细信息,而是后台编辑商品时在“其他信息”标签栏填写的那个“商品简单描述”,即goods_brief字段 2.修改lib_order.php文件的get_cart_ ...

随机推荐

  1. Javaweb项目中修改表单时数据回显方法

    1.前言 先来说下什么是数据回显,比如我要修改我的个人信息,点击修改按钮后进入修改界面,在这个界面中直接将原来的信息显示在表单中,而不是空表单,这就是数据回显 2.思路 当点击修改的时候,从数据库中查 ...

  2. linux 开机自启动redis服务

    [Unit] Description=The redis-server Process Manager Documentation=https://redis.io/ After=network.ta ...

  3. Docker 网络原理

    引言 学习docker网络,可以带着下面两个问题来探讨 容器之间可以相互访问的原理 容器暴露端口后,通过宿主机访问到容器内应用,并且对于访问端而言不用感知容器存在的原理 Docker 本身的技术依赖L ...

  4. 工作中遇到的js跨域问题总结

    起因:之前在做一个项目的时候有这样一个问题,127.0.0.1域名上的一个页面A.html,需要访问127.0.0.2域名上B.html页面中的一个方法.这就涉及到JS跨域访问了,通过查阅资料,得以解 ...

  5. Electron – 基础学习(2): 项目打包成exe桌面应用 之electron-packager

    项目创建完成,启动正常,接下来就是项目打包了.将测试Demo打包成exe桌面应用,点击exe文件,运行项目. 书接上文,创建项目有三种方式 Git拷贝.直接创建:通过electron社群提供的命令行工 ...

  6. Android实战项目——家庭记账本(二)

    今天主要是对昨天做的添加账单信息的功能做了完善,实现了数据库的相关操作,如图是对已添加的账单信息的总结显示. 目前实现了通过日期进行汇总的功能,如上图中的各项item就是通过对所有账单信息进行按日期汇 ...

  7. MySQL8.0远程连接和用户授权相关设置

    文章目录 1.开启MySQL远程连接 2.关闭MySQL远程连接 3.修改防火墙规则,开放端口 4.创建用户以及给用户授权 5.删除用户及权限 1.开启MySQL远程连接 mysql -u root ...

  8. 剑指offer-面试题55-平衡二叉树-递归

    /* 题目: 判断二叉树是否为平衡二叉树. */ /* 思路: 判断二叉树的左子树和右子树高度相差是否为1. */ #include<iostream> #include<cstri ...

  9. linux系统如何进行录屏

    linux系统如何录屏安装SimpleScreenRecorder 按Ctrl+ALt+T打开终端 添加源: sudo add-apt-repository ppa:maarten-baert/sim ...

  10. 简单记账本APP开发一

    在对Android的一些基础的知识有了一定了解,以及对于AndroidStudio的如何使用有了 一定的熟悉后,决定做一个简单的记账本APP 开发流程 1.记账本的页面 2.可以添加新的账目 (一)页 ...