Http请求上下文(一)
一旦请求的上下文被创建,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 |
可重写方法,请求完毕时该方法会清理所有已注册模块的实例变量。在这之后,Request、Response、Session、Application都不再可用。 |
GetVaryByCustomString |
可重写方法,一种基于自定义的字符串来设置输出的缓冲的方法,针对应用程序中的所有页面。 |
Init |
可重写方法,能够在所有用于处理请求的模块连接到应用程序后,执行自定义的初始化代码。我们可以使用它来创建和配置请求过程要用到的任何对象。此时Request、Response、Session、Application还不能用。 |
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.