Http请求上下文(一)

      asp.net工作线程对传入的http请求进行处理的时候会涉及很多步骤。请求会被分配给aspnet_isapi.dll ISAPI扩展,然后由后者交给Http运行管道.asp.net管道入口为httpruntime类。对于每个请求都会创建一个该类的实例。由这个实例控制请求的整体执行过程,并为浏览器生成响应文本。在这个实例化过程中,HttpRuntime类会执行许多初始化工作。首先创建一个包装对象(wrapper【包装材料,包装纸, 书皮】 object,即请求上下文)封装与请求相关的Http信息,然后该对象(HttpContext类的实例),沿着官道传递并由各个模块用于访问其内部的工作对象,如Request、Response、Server。
      一旦请求的上下文被创建,HttpRuntime类就会建立处理请求的Asp.Net的应用程序对象。Asp.Net的应用程序是由很多的HttpApplication类的实例组成。HttpRuntime会根据请求的类型确定相应的HttpApplication处理对象,此后,此对象来负责整个请求的生存周期,只有把这次请求处理完成,此对象才能被重用。如果此对象在处理请求的期间又有新的同类请求需要处理(并发请求),HttpRuntime则会创建新的HttpApplication对象,并放入对象池中。
      一. HttpApplication类的属性
      Asp.Net运行库的基础结构会创建HttpApplication的实例,用户不能直接创建HttpApplication的实例,创建好的实例会被放入对象池中,因此每个对象会在生存周期内处理多次请求,但每次只能处理一个。HttpApplication类的属性有:
            属性                             说明
      Appliction        HttpApplicationState类的实例。该实例代表程序全局的状态,等价于asp的Application。
      Context          HttpContext类的实例,改实例在单个对象中封装当前请求的所有Http信息,它的内部对象(如Application、Request) 以属性的方式显示出来
      Modules          获取影响当前应用程序的模块的集合
      Request          HttpRequest类的实例,代表当前的Http请求。
      Response        HttpResponse类的实例。该实例能够向客户端发送HTTP响应数据。
      Server             HttpServerUtility类的实例。该实例提供了用于处理web请求的辅助方法。
      Session           HttpSessionState类的实例。该实例用于管理特定用户的数据。
      User                IPrincipal对象,代表发出请求的用户。
      对于HttpApplication类的属性和它的可重写方法及事件,我们都可以通过编程的访问方式在global。asax文件中处理它们。
       二. HttpApplication类的方法
      
       有两类方法,一种是操作方法(operational method),另一种是事件处理程序方法。以下是操作方法列表:
           

方法

说明

CompleteRequest

用于设置一个内部的标记,此标记会跳过管道中的所有后续步骤,并直接执行EndRequest,大多数情况由HTTP模块使用。

Dispose

可重写方法,请求完毕时该方法会清理所有已注册模块的实例变量。在这之后,RequestResponseSessionApplication都不再可用。

GetVaryByCustomString

可重写方法,一种基于自定义的字符串来设置输出的缓冲的方法,针对应用程序中的所有页面。

Init

可重写方法,能够在所有用于处理请求的模块连接到应用程序后,执行自定义的初始化代码。我们可以使用它来创建和配置请求过程要用到的任何对象。此时RequestResponseSessionApplication还不能用。

      注意:每个对web应用程序的请求都会执行init,而Application_Start只在web应用程序的生存周期中执行一次。Init会指示已初始化的HttpApplication类的新实例处理传入的请求,而Application_Start是在web应用程序启动时创建第一个HttpApplication处理第一个请求。同理Dispose用于一次请求终结时清理占用资源,不一定是应用程序的结束。Application_End只会在应用程序关闭时引发,并只会引发一次。 所有在init中创建的资源的生存周期,仅限于本次请求,最晚会在Dispose中被释放,如果需要保存数据,应使用应用程序中的其他对象或会话状态。
      HttpApplication类的事件处理方法: HttpApplication还有几个用于处理应用程序级事件的的异步方法,用户应用程序不会用到这些方法,只有Http模块用他们来注册请求的执行链中生成的事件。HttpApplication类的事件如下:

       

事件

说明

AcquireRequestState

PostAcquireRequestState

这两个事件分别在处理程序实在处理请求并获取请求上下文信息的前后引发。

AuthenticateRequest

Post AuthenticateRequest

分别在安全模块建立用户标识的前后引发

AuthorizeRequest

Post AuthorizeRequest

分别在安全模块验证用户授权的前后引发。

BeginRequest

HTTP管道开始处理请求时引发

EndRequest

HTTP管道链(Pipeline chain of execution)

Error

在出现未处理异常时引发

PostMapRequestHandler

在发现用于处理请求的HTTP处理程序时引发

PostRequestHandlerExecute

在选定的HTTP处理程序执行完毕时引发,响应文本应经生成。

PreRequestHandlerExecute

在选定的HTTP处理程序开始执行时引发。

PreSendRequestContent

ASP.NET向客户端发送脚本的时候引发

PreSendRequestHeaders

ASP.NET向客户端发送HTTP表头前引发

ReleaseRequestState

Post ReleaseRequestState

分别在当前请求的上下文信息被释放的前后引发。

ResolveRequestCache

Post ResolveRequestCache

分别在ASP.NET运行库通过输出缓存完成处理请求的前后引发。

UpdateRequestCache

PostUpdateRequestCache

分别在ASP.NET运行库将当前请求的响应存入输出缓存的前后引发。

注:asp.net 1.x中没有相关的Post_事件

      如果要以异步的方式处理这些事件,应用程序需要使用带有AddOnXXXAsync命名模式的方法,其中的XXX代表事件名称。 若要使用同步方式注册这些事件,则需要在global。asax中定义事件处理程序,并遵循以下签名规则:
      Public void Application_XXX(object sender,EventArgs e)
      { //代码}
      其中XXX必须用上表中的事件名称代替。表中的所有事件都与数据无关。使用以下语法也可以:
      Public void Application_XXX()
      { //代码}
      在global.asax中除了可以处理表中的事件外还可以处理Appliction_Start和Application_End.

转载于:https://www.cnblogs.com/helloczh/articles/1559211.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值