在处理请求执行链的各个阶段中,会有一个对象在各个对象之间进行传递,也即会保存请求的上下文信息,这个对象就是HttpContext对象。HttpContext粉状了ASP.NET要处理的单次请求的所有信息。在请求处理机制建立时,HttpContext类有HttpRuntime对象实例化,接着该对象会经历请求生存期的各个阶段。如图所示:
图:封装了请求所有有关信息的HttpContext对象沿HTTP管道传递,直到生成客户端响应
HttpContext类的属性有:
名称 |
说明 |
获取在处理 HTTP 请求的过程中累积的错误数组,其中的元素代表处理请求过程中出现的错误。 |
|
为当前 HTTP 请求获取 HttpApplicationState 对象,其中包含应用程序的全局状态。 |
|
获取或设置当前 HTTP 请求的 HttpApplication 对象。该对象实际的类型为global.asax的代码隐藏类。如要访问定义在global.asax中公共属性和方法,则需要类型转换。 |
|
为当前 HTTP 请求获取 Cache 对象,该对象是ASP.NET特有的。 |
|
获取当前 HTTP 请求 HttpContext 对象。 |
|
获取表示当前正在执行的处理程序的 IHttpHandler 对象,该属性是只读的,返回存储在Handler的值。 |
|
获取在处理 HTTP 请求的过程中累积的第一个错误(如果有)。 |
|
获取或设置负责处理 HTTP 请求的 IHttpHandler 对象(HTTP处理程序)。 |
|
获取一个值,该值指示是否已为当前 HTTP 请求启用自定义错误。 |
|
获取一个值,该值指示当前 HTTP 请求是否处于调试模式。 |
|
获取可用于在 HTTP 请求过程中在 IHttpModule 接口和 IHttpHandler 接口之间组织和共享数据的键/值集合(用于HTTP模块和HTTP处理程序间共享自定义数据和对象,是一个哈希表)。 |
|
获取父处理程序的 IHttpHandler 对象(当前处理的上个处理程序)。 |
|
获取当前用户配置文件的 ProfileBase 对象。 |
|
为当前 HTTP 请求获取 HttpRequest 对象,该实例代表HTTP请求。 |
|
为当前 HTTP 响应获取 HttpResponse 对象,该对象可以向客户端发送响应数据。 |
|
获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象,该对象提供了处理web请求的辅助方法。 |
|
为当前 HTTP 请求获取 HttpSessionState 对象,该对象用于管理与会话状态有关的数据。 |
|
获取或设置一个值,该值指定 UrlAuthorizationModule 对象是否应跳过对当前请求的授权检查。 |
|
获取当前 HTTP 请求的初始时间戳的DateTime对象。 |
|
为当前 HTTP 响应获取 TraceContext 对象。 |
|
为当前 HTTP 请求获取或设置安全信息,能够获取到得是IPrincipal对象,代表发出请求用户的标识。 |
Current属性是个十分有用的静态成员,返回当前请求的HttpContex对象。Items是一个哈希表,在处理请求所涉及的模块和处理程序间共享数据。每个自定义模块或处理程序能够将自身信息添加到请求的HttpContext对象中,在Items中存储的信息最终被页面使用,但这些信息只能在请求的执行期间访问。
HttpContext类的方法
将异常添加到当前 HTTP 请求的异常集合中。 |
|
清除当前 HTTP 请求的所有错误。 |
|
为当前应用程序返回请求的配置信息。 |
|
为当前 HTTP 请求返回所请求的配置信息。 |
|
已重载。 获取应用程序级别资源。 |
|
用作特定类型的哈希函数。 GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。) |
|
已重载。 获取页级别资源。 |
|
获取当前应用程序的默认配置的指定配置节。 |
|
确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。) |
|
已重载。 指定内部重写路径,并允许请求的 URL 与资源的内部路径不同。 RewritePath 用在无 Cookie 会话状态中(重写当前Request对象的URL和查询字符串)。 |
|
URL重写
RewritePath 方法使我们能够在运行时更改当前请求的URL,从而执行某种内部的从定向。这样,显示页面便是通过RewritePath 设置的,但显示在地址栏的地址仍保持不变。URL的更改发生在服务器端,更重要的是在同一次调用的上下文中。RewritePath 主要在global.asax中使用。如果在回发事件上下文中使用该方法,可能遇到某些试图状态方面的问题。
以编程的方式加载资源
Page和HttpContext类分别提供了一对用于检索嵌在应用程序中资源的方法.GetGlobalResourceObject用于检索全局资源,其定义在.resx文件中,且位于特殊文件夹App_GlobalResources下,GetLocalResourceObject针对的也是.resx文件,但位于指定页面特殊的文件夹App_LocalResources下。代码如下:
String str=(string)HttpContext.GetGlobalResourceObject("资源文件的名称(不带扩展名)","资源名称");
string str=(string)HttpContext.GetLocalResourceObject("页面的虚拟路径","资源名称");
HttpServerUtility类的方法
Server是HttpServerUtility类的实例。该实例在请求开始处理时创建,之后被存储在请求上下文中。HttpServerUtility类的方法有:
名称 |
说明 |
清除前一个异常。 |
|
已重载。 创建 COM 对象的一个服务器实例。 |
|
创建 COM 对象的服务器实例,该对象由对象的类标识符 (CLSID) 标识。 |
|
已重载。 在当前请求的上下文中执行指定资源的处理程序,然后将控制返回给该处理程序。 |
|
用作特定类型的哈希函数。 (从 Object 继承) |
|
返回前一个异常。 |
|
已重载。 对已被编码以消除无效 HTML 字符的字符串进行解码。 |
|
已重载。 对要在浏览器中显示的字符串进行编码。 |
|
返回与 Web 服务器上的指定虚拟路径相对应的物理文件路径。 |
|
确定指定的 Object 实例是否是相同的实例。 (从 Object 继承) |
|
已重载。 终止当前页的执行,并为当前请求开始执行新页。 |
|
已重载。 |
|
已重载。 对字符串进行解码,该字符串为了进行 HTTP 传输而进行编码并在 URL 中发送到服务器。 |
|
已重载。 编码字符串,以便通过 URL 从 Web 服务器到客户端进行可靠的 HTTP 传输。 |
|
对 URL 字符串的路径部分进行 URL 编码,并返回已编码的字符串。 |
|
将 URL 字符串标记解码为使用 64 进制数字的等效字节数组。 |
|
将字节数组编码为使用 64 进制数字并适合在 URL 上传输的等效字符串表示形式。 |
下面的代码示例演示如何使用 HttpServerUtility 类的 HtmlEncode 方法和 UrlEncode 方法。HtmlEncode 方法有助于确保用户提供的任何字符串输入都将在浏览器中呈现为静态文本,而不是呈现为可执行的脚本代码或已解析的 HTML 元素。UrlEncode 方法对 URL 进行编码,以使它们可以正确地在 HTTP 流中传输。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(TextBox1.Text))
{
// Access the HttpServerUtility methods through
// the intrinsic Server object.
Label1.Text = "Welcome, " +
Server.HtmlEncode(TextBox1.Text) +
".<br/> The url is " +
Server.UrlEncode(Request.Url.ToString());
}
}
</script>
<html >
<head runat="server">
<title>HttpServerUtility Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Enter your name:<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" />
<br />
<asp:Label ID="Label1" runat="server"/>
</div>
</form>
</body>
</html>
HttpServerUtility类的属性
获取服务器的计算机名称。 |
|
获取和设置请求超时值(以秒计)。 |
HttpResponse对象
Http响应信息由HttpResponse类进行封装。该类的实例创建于开始处理请求的时刻,之后实例被链接到与请求的HttpContext对象,通过HttpContext的Response属性表现。
HttpResponse类的属性有:
名称 |
说明 |
获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个响应之后将其发送。 |
|
获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个页之后将其发送。 |
|
获取网页的缓存策略(过期时间、保密性、变化子句)。 |
|
将 Cache-Control HTTP 头设置为 Public 或 Private。 |
|
获取或设置输出流的 HTTP 字符集。 |
|
获取或设置输出流的 HTTP 字符集。 |
|
获取或设置输出流的 HTTP MIME 类型。 |
|
获取响应 Cookie 集合。 |
|
获取或设置在浏览器上缓存的页过期之前的分钟数。如果用户在页面过期之前返回该页,则显示缓存版本。提供 Expires 是为了与以前版本的 ASP 兼容。 |
|
获取或设置从缓存中移除缓存信息的绝对日期和时间。提供 ExpiresAbsolute 是为了与以前版本的 ASP 兼容。 |
|
获取或设置一个包装筛选器对象,该对象用于在传输之前修改 HTTP 实体主体。 |
|
获取或设置一个 Encoding 对象,该对象表示当前标头输出流的编码。 |
|
获取一个值,通过该值指示客户端是否仍连接在服务器上。 |
|
获取一个布尔值,该值指示客户端是否正在被传输到新的位置。 |
|
启用到输出 HTTP 响应流的文本输出。 |
|
启用到输出 Http 内容主体的二进制输出。 |
|
获取或设置 Http“位置”标头的值。 |
|
设置返回到客户端的 Status 栏。 |
|
获取或设置返回给客户端的输出的 HTTP 状态代码。 |
|
获取或设置返回给客户端的输出的 HTTP 状态字符串。 |
响应缓存策略的设置
在ASP.NET中,所有缓存功能由HttpCachePolicy类来设置。对于页面的缓存,该类扮演着双重角色。该类提供的方法,有的用于设置缓存特定的HTTP标头,有的用于控制ASP.NET页面输出缓存。对于设置客户端缓存中页面的可见性,可以使用HttpCachePolicy类的SetCachePolicy方法。SetExpires方法用于设置过期时间,该方法接受一个绝对的DateTime对象,若要设置缓存页面的生存期,将当前时间加上预期间隔,并传入SetExpires即可。如果发生缓存策略冲突,系统会采用限制最强的设置。比如说页面包含两个控件,分别将Cache-Contorl标头设置为Public和Private,则被设为Private的回被发往客户端。
输出筛选器的设置
响应筛选器是一种派生自Stream的对象,与HttpResponse对象相关联。该对象能够对页面的输出进行监视和筛选。如果将Filter属性设置为派生自Stream类的实例,那么所有将要写入底层HTTP编写器的输出会通知该输出筛选器。如果设置了自定义筛选器,那么将在HttpResponse的Flush方法执行期间且在实际文本发送给客户端之前调用。筛选器适合于对标记做最后的处理,往往用于对控件生成的标记进行压缩或修正。构建响应筛选器是指构建一个新的流(Stream)的派生类,并重写其中的某些方法。该类应该接受Stream对象作为构造函数的参数。因此,响应筛选器类不仅是一个继承于流的类,还是一个包装器的类。如果将MemoryStream或FileStream这样的类的实例直接赋给Response.Filter,则会抛出异常。
下面的代码示例是一个 ASP.NET 页,其中将 Filter 属性设置为 UpperCaseFilter 类的新实例,该类是一个自定义 Stream 类,用于将经过的所有文本转换为大写。将有关该请求的信息将保存在一个文本文件中,然后设置 Filter 属性。在响应筛选器准备就绪之后,该代码调用 MapPath 方法以获取一个名为 TestFile.txt 的文本文件的绝对路径,该文件将作为响应的内容源。然后,该代码新建一个 StreamReader 对象以便从头至尾读取该文本文件,最后调用 Write 方法在相应页上显示该文件的内容
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ import Namespace="Samples.AspNet.CS.Controls" %>
<script runat="server">
private void Page_Load(object sender, EventArgs e)
{
// Filter the text to be rendered as all uppercase.
Response.Filter = new UpperCaseFilterStream(Response.Filter);
// Convert a virtual path to a fully qualified physical path.
string fullpath = Request.MapPath("~""TestFile.txt");
try
{
// Read the contents of the file using a StreamReader.
using (StreamReader sr = new StreamReader(fullpath))
while (sr.Peek() >= 0)
{
Response.Write((char)sr.Read());
}
Message.Text = "Reading the file was successful.";
}
catch (Exception ex)
{
Message.Text = "The process failed.";
}
}
</script>
<html>
<head>
<title>HttpResponse.MapPath Example</title>
</head>
<body>
<form runat="server">
<asp:Label id="Message"
runat="server"/>
</form>
</body>
</html>
HttpServerUtility类的方法
名称 |
说明 |
将一组缓存依赖项与响应关联,这样,如果响应存储在输出缓存中并且指定的依赖项发生变化,就可以使该响应失效。 |
|
已重载。 使缓存响应的有效性依赖于缓存中的其他项。 |
|
使缓存响应的有效性依赖于缓存中的其他项。 |
|
已重载。 使缓存响应的有效性依赖于缓存中的其他项。 |
|
将单个文件名添加到文件名集合中,当前响应依赖于该集合。 |
|
将一个 HTTP 头添加到输出流。提供 AddHeader 是为了与以前版本的 ASP 兼容。 |
|
将一个 HTTP Cookie 添加到内部 Cookie 集合。 |
|
将 HTTP 头添加到输出流。 |
|
将自定义日志信息添加到 Internet 信息服务 (IIS) 日志文件。 |
|
如果会话使用 Cookieless 会话状态,则将该会话 ID 添加到虚拟路径中,并返回组合路径。如果不使用 Cookieless 会话状态,则 ApplyAppPathModifier 返回原始的虚拟路径。 |
|
将一个二进制字符串写入 HTTP 输出流。 |
|
清除缓冲区流中的所有内容输出。 |
|
清除缓冲区流中的所有内容输出。 |
|
清除缓冲区流中的所有头。 |
|
关闭到客户端的套接字连接。 |
|
将当前所有缓冲的输出发送到客户端,停止该页的执行,并引发 EndRequest 事件。 |
|
向客户端发送当前所有缓冲的输出。 |
|
用作特定类型的哈希函数。 GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。) |
|
将一个 PICS-Label HTTP 标头追加到输出流。 |
|
已重载。 将客户端重定向到新的 URL。 |
|
确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。) |
|
静态方法从缓存中移除所有与指定路径关联的缓存项。 |
|
更新 Cookie 集合中的一个现有 Cookie。 |
|
将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件。 |
|
已重载。 将信息写入 HTTP 响应输出流。 |
|
已重载。 将指定的文件直接写入 HTTP 响应输出流。 |
|
允许将响应替换块插入响应,从而允许为缓存的输出响应动态生成指定的响应区域。
|