今天我们来说一下一般处理程序,一般处理程序是什么呢? 一般处理程序实际上就是一个处理程序类。那么我们为什么要用?用他有什么优势? 对于ASP.NET网站来说,网站最常见的处理结果就是HTML网页,生成网页的工作通常使用拓展名为ASPX的web窗体来完成。对于处理结果不是HTML的请求,都可以通过一般处理程序完成,例如:RSS、Feed、XML、图片等。一般处理程序是ASP.NET网站中最为简单、高效的处理程序,在处理返回类型不是HTML的请求中有着重要的作用。那么如何使用呢?看一下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
namespace 一般处理程序Demo
{
/// <summary>
/// Download 的摘要说明
/// </summary>
public class Download : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//添加一个文件的数据类型
context.Response.ContentType = "application/octet-stream";
//将文件进行编码
string encodeFileName = HttpUtility.UrlEncode("文件.htm");//需要把文件名UrlEncode,因为有中文存在
//添加一个报文头
context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", encodeFileName));
//获得文件的文件名称
string filepath = context.Server.MapPath("Default.aspx");
//利用文件流保存
context.Response.Write(File.ReadAllText(filepath));
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
html页面代码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>文件打开与保存</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="Default.aspx">打开文件</a>
<a href="Download.ashx">保存文件</a>
</div>
</form>
</body>
</html>
大家可以看到,一般处理程序用起来很简单。那么我们看看一般处理程序中很重要的一个类:HttpContext类。
HttpContext类:封装有关个别HTTP请求的所有HTTP特定的信息,又叫上下文。 看到这个解释,我觉得有些抽象,Http特定信息具体又是什么?看了下备注:
为继承 IHttpModule 和 IHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部 Request、Response 和 Server 属性的访问。
1.生命周期:从用户发送请求开始到服务器处理完请求并生成内容返回到客户端为止。针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例.
2.HttpContext的作用:处理请求的属性如:request,response,server等。其实我们在开发asp.net页面的时候,可以直接使用request等,那为什么要通过HttpContext类来访问呢?因为request等这些可以在aspx页面的代码中直接使用,但是在IHttpModule或IHttpHandler中就不能直接使用。HttpContext类对Request、Response、Server等进行了封装,保证在整个请求周期内都可以随时随地地调用。
3.HttpContext其它功能:HttpContext还可以处理CacHe,HttpContext.Item等,在其生命周期内可以存储一些临时数据,方便随时使用。当用户发送某个Http请求,我们可以通过HttpContext进行截获,查看里面包含了哪些请求的信息,然后可以进行一系列的操作,比如说切换到其他的页面,这个时候,可以重组请求的数据满足新页面的要求。即:即使不在page页面中,也可以通过HttpContext的Current属性来获取当前的web状态。
到这里对httpcontext类有了一个大致的了解,下面看看httpcontext的属性和方法。 属性和方法的详细使用可以查询MSDN。
附两张表:
属性:
名称 | 说明 |
|
| AllErrors | 获取在处理 HTTP 请求的过程中累积的错误数组。 |
| Application | 为当前 HTTP 请求获取 HttpApplicationState 对象。 |
| ApplicationInstance | 为当前 HTTP 请求获取或设置 HttpApplication 对象。 |
| Cache | 为当前 HTTP 请求获取 Cache 对象。 |
| Current | 为当前 HTTP 请求获取 HttpContext 对象。 |
| CurrentHandler | 获取表示当前正在执行的处理程序的 IHttpHandler 对象。 |
| Error | 获取在处理 HTTP 请求的过程中累积的第一个错误(如果有)。 |
| Handler | 获取或设置负责处理 HTTP 请求的 IHttpHandler 对象。 |
| IsCustomErrorEnabled | 获取一个值,该值指示是否已为当前 HTTP 请求启用自定义错误。 |
| IsDebuggingEnabled | 获取一个值,该值指示当前 HTTP 请求是否处于调试模式。 |
| Items | 获取可用于在 HTTP 请求过程中在 IHttpModule 接口和 IHttpHandler 接口之间组织和共享数据的键/值集合。 |
| PreviousHandler | 获取父处理程序的 IHttpHandler 对象。 |
| Profile | 获取当前用户配置文件的 ProfileBase 对象。 |
| Request | 为当前 HTTP 请求获取 HttpRequest 对象。 |
| Response | 为当前 HTTP 响应获取 HttpResponse 对象。 |
| Server | 获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象。 |
| Session | 为当前 HTTP 请求获取 HttpSessionState 对象。 |
| SkipAuthorization | 获取或设置一个值,该值指定 UrlAuthorizationModule 对象是否应跳过对当前请求的授权检查。 |
| Timestamp | 获取当前 HTTP 请求的初始时间戳。 |
| Trace | 为当前 HTTP 响应获取 TraceContext 对象。 |
| User | 为当前 HTTP 请求获取或设置安全信息。 |
方法:
名称 | 说明 |
|
| AddError | 将异常添加到当前 HTTP 请求的异常集合中。 |
| ClearError | 清除当前 HTTP 请求的所有错误。 |
| Equals | 已重载。 确定两个 Object 实例是否相等。 (从 Object 继承。) |
| GetAppConfig | 为当前应用程序返回请求的配置信息。 |
| GetConfig | 为当前 HTTP 请求返回所请求的配置信息。 |
| GetGlobalResourceObject | 已重载。 获取应用程序级别资源。 |
| GetHashCode | 用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从Object 继承。) |
| GetLocalResourceObject | 已重载。 获取页级别资源。 |
| GetSection | 获取当前应用程序的默认配置的指定配置节。 |
| GetType | 获取当前实例的 Type。 (从 Object 继承。) |
| ReferenceEquals | 确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。) |
| RewritePath | 已重载。 指定内部重写路径,并允许请求的 URL 与资源的内部路径不同。RewritePath 用在无 Cookie 会话状态中。 |
| ToString | 返回表示当前 Object 的 String。 (从 Object 继承。) |