1.1 Response对象和Request对象
Request对象是ASP.NET中HTTP通信对象过程中的重要对象。其中Request对象发出HTTP请求,Response对象响应HTTP请求,它们是组成ASP.NET中的HTTP通信过程,不可缺少的一部分。
获取Response对象的信息并输出
在ASP.NET中的HTTP通信过程中,HttpResponse对象响应Http请求。其中,为了编程方便,HttpResponse对象通过Response对象进行公开。实际上,Response对象是HttpResponse类的一个实例。HttpResponse对象封装了ASP.NET中的Http请求中的响应信息,并提供对当前页的输出流操作方法。HttpResponse对象能够向网页输出信息,如文本,图片等,并且还为输出的信息提供缓冲区。
HttpResponse对象不但可以在网页上输出信息,而且可以使用End()方法或中止网页的输出。其包含了许多常用的方法,如 Write(),WriteFile(),Flush(),End(),Close()等
用反射机制遍历HttpResposne对象的所有成员(包括方法和属性)的信息,如果成员是方法,则在方法的名称之后添加“()”代码如下:
private void PrintResposneInfo()
{
// 获取Response实例
// HttpResponse response = HttpApplication;
Type t = Response.GetType();
foreach (MemberInfo mi in t.GetMembers())
{
// 输出成员信息
if(mi.GetType().BaseType.Name == "MethodInfo")
{
Response.Write("MemberInfo"+mi.Name+"():</br>");
}
else
{
Response.Write("MemberInfo"+mi.Name+"()");
}
Response.Write(" DeclaringType:"+mi.DeclaringType.ToString());
Response.Write(" MemberType:"+mi.MemberType.ToString());
Response.Write(" MetadataToken:"+mi.MetadataToken.ToString());
Response.Write(" ReflectedType:"+mi.ReflectedType.ToString());
}
}
1.2. Http请求上下文
Http请求上下文(HttpContext对象)是ASP.NET中的重要对象,它包括了ASP.NET在HTTP请求中的大部分对象的信息,如Request,Response,Server,Modules 等对象。HttpContext对象 在ASP.NET应用程序的Http请求的过程各个步骤中保持各个对象之间的联系。HttpContext对象封装了ASP.NET中单个Http请求的所有可用的信息,并在请求处理机制时由HttpRunTime对象实例化。HttpContext对象在ASP.NET的Http请求的过程中与各个对象之间的关系:
1.3 应用程序的Application实例
在Asp.net 应用程序中,HttpApplication 实例是唯一的,表示Http请求过程中的整个应用,当应用程序开始运行时,HttpApplication 实例由Asp.Net基本运行库创建,开发过程中不需要显示创建HttpApplication类的实例。如果需要HttpApplication实例,直接获取即可。
// 获取应用程序HttpApplication 实例
HttpApplication thisHttpApp = ApplicationInstance;
ASP.NET应用程序运行之后,首先创建HttpRuntime对象,然后由HttpApplicationFactory对象创建或选择 HttpApplication对象,然后由HttpApplication处理ASP.NET应用程序请求资源。
创建一个类(MyHttpModule),该类介绍了使用Http上下文对象(HttpConext)的方法。MyHttpModule类继承于接口IHttpModule(处理Http请求过程中的模块信息的一个接口),首先定义函数Init(HttpApplication httpApp) ,并在该函数中初始化应用程序的HttpApplication实例的AcquireRequestState事件和PostAcquireRequestState事件。其中AcquireRequestState事件和PostAcquireRequestState事件分别使用HttpContext对象和Resposne对象的Write()方法显示事件名称:
class MyHttpModule:IHttpModule
{
public void Dispose()
{
throw new NotImplementedException();
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
context.PostAcquireRequestState += new EventHandler(context_PostAcquireRequestState);
}
void context_PostAcquireRequestState(object sender, EventArgs e)
{
HttpApplication httpApp = (HttpApplication)sender;
HttpContext context = HttpContext.Current;
context.Response.Write("context_PostAcquireRequestState");
}
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication httpApp = (HttpApplication)sender;
HttpContext context = HttpContext.Current;
context.Response.Write("context_AcquireRequestState");
}
}
新建一个页面,页面加载时首先获取应用程序HttpApplication实例,然后创建MyHttpModule的实例http并调用函数Init(HttpApplication httpApp)进行初始化,随后触发HttpApplication实例的AcquireRequestState和PostAcquireState事件,最后显示HttpApplication实例包含ASP.NET应用程序的重要对象的信息。
protected void Page_Load(object sender, EventArgs e)
{
HttpApplication thisHttpApp = new HttpApplication();
MyHttpModule http = new MyHttpModule();
http.Init(thisHttpApp);
// 调用 AcquireRequestState
http.context_AcquireRequestState(thisHttpApp,e);
// 调用 PostAcquireRequestState
http.context_PostAcquireRequestState(thisHttpApp,e);
Response.Write(thisHttpApp.Application.ToString());
Response.Write(thisHttpApp.Context.ToString());
Response.Write(thisHttpApp.Modules.ToString());
Response.Write(thisHttpApp.Request.ToString());
Response.Write(thisHttpApp.Response.ToString());
Response.Write(thisHttpApp.Server.ToString());
Response.Write(thisHttpApp.Session.ToString());
}