有关应用程序状态的详情、处理的请求以及构建的响应信息全部通过上下文对象来获取。下面将介绍用于提供上下文的类:HttpContext、 HttpApplication,HttpRequest,HttpResponse类,所有这些类均位于System.Web。
13.4.1 HttpContext
Encapsulates all HTTP-specific information about an individual HTTP request. HttpContext。用于从头到尾跟踪请求的状态,它也是有关请求的所有可用信息(包括HttpRequest和HttpResponse对象)的通道。还会定义可用于管理请求生命周期的方法和属性。
名称 | 说明 | |
---|---|---|
Application |
为当前 HTTP 请求获取 HttpApplicationState 对象。 |
|
ApplicationInstance |
为当前 HTTP 请求获取或设置 HttpApplication 对象。 |
|
Cache |
获取当前应用程序域的 Cache 对象。 |
|
Current |
为当前 HTTP 请求获取或设置 HttpContext 对象。 |
|
CurrentHandler |
获取表示当前正在执行的处理程序的 IHttpHandler 对象。 |
|
CurrentNotification |
获取一个 RequestNotification 值,该值指示当前正在处理的 HttpApplication 事件。 |
|
Error |
获取在处理 HTTP 请求的过程中累积的第一个错误(如果有)。 |
|
Handler |
获取或设置负责处理 HTTP 请求的 IHttpHandler 对象。 |
|
IsDebuggingEnabled |
获取一个值,该值指示当前 HTTP 请求是否处于调试模式。如果已将调试器附加到web窗体应用程序,则返回true。 |
|
IsPostNotification |
在 HttpApplication 事件完成处理之后获取 ASP.NET 管道的当前进程点的值。 |
|
Items |
获取可用于在 HTTP 请求过程中在 IHttpModule 接口和 IHttpHandler 接口之间组织和共享数据的键/值集合。返回可用于 在参与处理请求的ASP.NET Framework组件之间传递状态数据的集合。 |
|
Profile |
获取当前用户配置文件的 ProfileBase 对象。 |
|
Request |
为当前 HTTP 请求获取 HttpRequest 对象。 |
|
Response |
获取当前 HTTP 响应的 HttpResponse 对象。 |
|
Server |
获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象。其中包含实用功能,最有用的功能包括:用于对字符串 进行安全编码以将其作为HTML显示的方法,以及用于控制请求处理程序执行的功能。 |
|
Session |
为当前 HTTP 请求获取 HttpSessionState 对象。 |
|
Timestamp |
获取当前 HTTP 请求的初始时间戳。 |
|
Trace |
获取当前 HTTP 响应的 TraceContext 对象。 |
|
User |
获取或设置当前 HTTP 请求的安全信息。 |
13.4.2 HttpApplication
在ASP.NET Framework 中用到的许多基类都提供了一些便捷属性,这些属性与那些由HttpContext类定义的属性对应。Defines the methods, properties, and events that are common to all application objects in an ASP.NET application.
属性
名称 | 说明 | |
---|---|---|
Application |
获取应用程序的当前状态。 |
|
Context |
获取关于当前请求的 HTTP 特定信息。 |
|
Events |
获取处理所有应用程序事件的事件处理程序委托列表。 |
|
Modules |
获取当前应用程序的模块集合。 |
|
RegisterModule(type) |
添加一个新模块。 |
|
Request |
获取当前请求所对应的内部请求对象。 |
|
Response |
获取当前请求所对应的内部响应对象。 |
|
Server |
获取当前请求所对应的内部服务器对象。 |
|
Session |
获取提供对会话数据的访问的内部会话对象。 |
|
User |
获取当前请求的内部用户对象。 |
方法
CompleteRequest() |
使 ASP.NET 跳过 HTTP 执行管线链中的所有事件和筛选并直接执行EndRequest 事件。 |
|
Dispose() |
处置 HttpApplication 实例。 |
|
Equals(Object^) |
确定指定的对象是否等于当前对象。(从 Object 继承。) |
|
GetType() | ||
Init() |
在添加所有事件处理程序模块之后执行自定义初始化代码。 |
|
ToString() |
返回表示当前对象的字符串。(从 Object 继承。) |
这其中的多数成员都是HttpContext类对应的便捷属性。接下来介绍一些要注意的要点。
1.处理属性异常
Request,Response、Session、User属性全部返回HttpContext类中对应属性的值,缺点是:如果他们从HttpContext中获得的值为null,所有这些属性将抛出HttpException。
//使用HttpContext属性来确定当前应用程序事件。 public Global() { BeginRequest += HandleEvent; EndRequest += HandleEvent; AcquireRequestState += HandleEvent; PostAcquireRequestState += HandleEvent; } protected void HandleEvent(object sender, EventArgs e) { string eventName = "<Unknown>"; switch (Context.CurrentNotification) { case RequestNotification.BeginRequest: case RequestNotification.EndRequest: eventName = Context.CurrentNotification.ToString(); break; case RequestNotification.AcquireRequestState: if (Context.IsPostNotification) { eventName = "PostAcquireRequestState"; } else { eventName = "AcquireRequestState"; } break; } EventCollection.Add(EventSource.Application, eventName); }
protected void Application_Start(object sender, EventArgs e) { EventCollection.Add(EventSource.Application, "Start"); Application["message"] = "Application Events"; CreateTimeStamp(); }
protected void CreateTimeStamp() { string stamp = Context.Timestamp.ToLongTimeString(); if ( Session != null) { Session["request_timestamp"] = stamp; } else { Application["app_timestamp"] = stamp; } }
将会报错
更新CreateTimeStamp方法以使用HttpContext属性
protected void CreateTimeStamp() { string stamp = Context.Timestamp.ToLongTimeString(); if (Context.Session != null) { Session["request_timestamp"] = stamp; } else { Application["app_timestamp"] = stamp; } }
2完成请求
HttpApplication.CompleteRequest方法可用于废弃请求生命周期的正常流程。直接跳到LogRequest事件。如果要实现一个自定义错误处理程序模块,或者如果代码能够满足其自身的需求,而不需要其他模块或处理程序的帮助,那么可以使用此方法。
14.4.3 HttpRequest
HttpRequest对象用于描述所处理的HTTP请求。(使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。)下表列出了提供有关请求的信息的属性。
HttpRequest的作用是令到Asp.net能够读取客户端发送HTTP值。比如表单、URL、Cookie传递过来的参数。
返回字符串的那些值就不说了,那些基本上都是与HTTP请求报文相关的东西。
现在看看返回NameValueCollection对象的东东,这个对象只是为了存储返回的东西。
1、Request.Headers;
这个东西返回的是什么呢?写个实例:
public ActionResult Index() { HttpRequest request = System.Web.HttpContext.Current.Request; NameValueCollection headersCollect = request.Headers; string[] headArr = headersCollect.AllKeys; foreach (string str in headArr) { Response.Write(str + ":" + headersCollect.Get(str) + ";<br/>"); } return View(); }
看看在浏览器输出:
再用火狐看看HTTP请求报文的请求头信息:
明显可以看到,这个request.Headers返回的就是请求头信息的一个NameValueCollection集合。
2、Request.Form
这个属性获取的是浏览器提交的表单内容,也是返回NameValueCollection对象,这个对象中包含了所有的表单键值对内容。
看前台HTML代码:
<form action="/Home/GetForm" method="post"> <p>姓名:<input type="text" name="Name" /></p> //输入张三 <p>年龄:<input type="text" name="Age" /></p> //输入12 <p>性别:<input type="radio" name="male" value="man" />男 <input type="radio" name="male" value="woman" />女</p> //选择 男 <p><input type="submit" value="提交" /></p> </form>
后台代码:
public ActionResult GetForm() { HttpRequest request = System.Web.HttpContext.Current.Request; NameValueCollection FormCollect = request.Form; foreach (string str in FormCollect) { Response.Write(str + ": " + FormCollect.Get(str) + "<br/>"); } return Content("键值对数目:" + FormCollect.Count); }
浏览器输出:
Name: 张三 Age: 12 male: man 键值对数目:3
3、Request.QueryString
该属性的作用是将URL中的参数全部保存到NameValueCollection集合中。
public ActionResult TestCookie() { NameValueCollection nvc = new NameValueCollection(); nvc = System.Web.HttpContext.Current.Request.QueryString; Response.Write(nvc.Count + " "); //输出路径中参数集合的总数 if (nvc.Count > 0) { foreach (string str in nvc.AllKeys) { Response.Write(str + ": " + nvc.Get(str) + "; "); //遍历url参数集合,输出参数名与值 } } return View(); //当路径为http://localhost:22133/Home/testCookie?id=1&name=张三&Age=23 //输出3 id: 1; name: 张三; Age: 28;
4、Params,Item与QueryString、Forms的区别
- Get请求用QueryString;
- Post请求用Forms;
- Parms与Item可以不区分Get请求还是Post请求;
Params与Item两个属性唯一不同的是:Item是依次访问这4个集合,找到就返回结果,而Params是在访问时,先将4个集合的数据合并到一个新集合(集合不存在时创建), 然后再查找指定的结果。