* HTTP 模块和 HTTP 处理程序是 ASP.NET 体系结构的组成部分。在对一个请求进行处理时,由多个 HTTP 模块
(例如,身份验证模块和会话模块)处理每个请求,然后再由单个 HTTP 处理程序来处理。处理程序处理请求之后,
该请求再通过 HTTP 模块流转回来。
* HTTP 处理程序:
处理程序用于处理各个终结点请求。处理程序使 ASP.NET 框架可以处理应用程序内的单个 HTTP URL 或成组
的 URL 扩展。与模块不同,只有一个处理程序用于处理请求。所有处理程序均实现 IHttpHandler 接口,该
接口位于 System.Web 名称空间中。处理程序在某些方面与 Internet 服务器应用程序编程接口 (ISAPI) 扩展类似。
* HttpHandles:根据请求中指定的 URL (资源的位置(Path)) 和 HTTP 谓词(Verb)将传入的请求映射到相应的处理程序。可以在配置层次中的
任何级别声明此元素。
*
* HttpHandler实现了ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功
能的实现通过实现IHttpHandler接口来达到。
*
* ASP.NET 收到的每个传入 HTTP 请求最终由实现 IHTTPHandler 的类的特定实例来处理。
* IHttpHandler:定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。
IHttpHandler公共属性:
IsReusable: 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。如果 IHttpHandler 实例可
再次使用,则为 true;否则为 false。
IHttpHandler公共方法:
ProcessRequest:通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
*
* 创建 HTTP 处理程序
要创建 HTTP 处理程序,您必须实现 IHttpHandler 接口。IHttpHandler 接口具有一种方法和一种属性,并带有
下列签名:
void ProcessRequest(HttpContext);
bool IsReusable {get;}
注意:如果 HTTP 处理程序中需要会话状态,还需要实现 IRequiresSessionState 接口。
*
* HttpApplication:定义 ASP.NET 应用程序中的所有应用程序对象通用的方法、属性和事件。
此类是用户在 global.asax 文件中所定义的应用程序的基类。
*
* <httpHandlers> 设置由应用程序子目录继承。
* <add> 指令按由上而下的顺序进行处理。如果两个或多个 <add> 元素指定相同的谓词/路径组合,
* 则最后一个 <add> 会重写其他所有元素。
* Microsoft Internet 信息服务 (IIS) 有自己的 ISAPI 映射扩展模型。为使给定应用程序扩展与其处理程序之间的
* 映射生效,该扩展必须在 IIS 中映射为 ASP.NET ISAPI。对于自定义扩展等非标准扩展,则必须相应地配置 IIS。
* 配置 HTTP 处理程序:
<httpHandlers> 配置节处理程序负责将传入的 URL 映射到 IHttpHandler 或 IHttpHandlerFactory 类。它可以在
计算机、站点或应用程序级别声明。子目录将继承这些设置。
管理员使用 <add> 标记指令配置 <httpHandlers> 节。<Add> 指令是按从上到下的顺序进行解释和处理的。对于
<httpHandler> 节处理程序,请使用以下语法:
<httpHandlers>
<add verb="[verb list]" path="[path/wildcard]" type="[COM+ Class], [Assembly]" validate="[true/false]" />
<remove verb="[verb list]" path="[path/wildcard]" />
<clear />
</httpHandlers>
Web.config配置:
下面的示例演示如何执行以下操作:
将文件扩展名为 .New 的文件的所有 HTTP 请求映射到类 MyHandler.New
将文件扩展名为 .MyNewFileExtension 的文件的 HTTP GET 和 HEAD 请求映射到类 MyHandler.MNFEHandler.
两个类都位于 MyHandler.dll 文件中的程序集 MyHandler 中。
<httpHandlers>
<add verb="*" path="*.New" type="MyHandler.New,MyHandler"/>
<add verb="GET,HEAD" path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll"/>
</httpHandlers>
*
--------------------------------------------------------------------------------------------------------
* 假设写好了一个http处理程序,如何让他发挥作用呢?譬如,需要禁止asp.net下载.info文件,应该进行如下处理:
第一步,在web服务器上增加指示,让asp.net处理此扩展名。具体为:
打开IIS(假设web服务器是IIS),找到应用程序,配置,应用程序映射,添加映射,在可执行文件中输入当前.net版
本的aspnet_isapi.dll(如C:\WINNT\Microsoft.NET\Framework\v1.0.3705\aspnet_isapi.dll),扩展名输入.info,
谓词全部,检查文件是否存在。经过这些步骤,确保IIS不会自作多情处理.info文件,而让给aspnet_isapi.dll处理,
后者则会将请求交给asp.net进行处理。
第二步,在machine.config或者web.config中加入相映配置节。都是在<System.Web〉中的加入<httphandler>子节,
按照格式指定,譬如:
<httphandlers>
…
<add verb="*" path="*.info" type="System.Web.HttpForbiddenHandler"/>
…
</httphandlers>
经过上述节配置,.info文件会被保护起来,任何企图访问都会被告知“无法提供此类型的页。”;如果换成自己的
类,则被asp.net框架所调用来处理.info请求。
*
*
--------------------------------------------------------------------------------------------------------
*
先了解一下IIS系统。它是一个程序,负责对网站的内容进行管理并且处理对客户的请求做出反应。当用户对一个页面
提出请求时,IIS做如下反应(不考虑权限问题):
1.把对方请求的虚拟路径转换成物理路径
2.根据物理路径搜索请求的文件
3.找到文件后,获取文件的内容
4.生成Http头信息。
5.向客户端发送所有的文件内容:首先是头信息,然后是Html内容,最后是其它文件的内容(如图片、JS等)。
6.客户端IE浏览器获得信息后,解析文件内容,找出其中的引用文件,如.js .css .gif等,向IIS请求这些文件。
7.IIS获取请求后,发送文件内容。
8.当浏览器获取所有内容后,生成内容界面,客户就看到图像/文本/其它内容了。
HttpApplication 类提供有大量事件,模块可以与这些事件同步。对于每个请求,模块都可以与下列事件同步。这些
事件是按先后顺序列出的:
* • BeginRequest:请求已开始。如果您需要在请求刚开始时执行某些操作(例如在每页的顶部显示广告横幅),请同步
* 此事件。
* • AuthenticateRequest:如果您要插入自己自定义的身份验证方案(例如,在数据库中查找用户以验证密码),请构
* 建一个模块以同步此事件并按您需要的方式验证用户身份。
* • AuthorizeRequest:此事件用于内部实现授权机制(例如,将您的访问控制列表 (ACL) 存储在数据库中而不是文件
* 系统中)。虽然您可以覆盖此事件,但是最好不要这样做。
* • ResolveRequestCache:此事件确定是否可以从输出缓存中调用某个页面。如果您要编写自己的缓存模块(例如,
* 构建基于文件的缓存,而不是内存缓存),请同步此事件以确定是否从缓存中调用页面。
* • AcquireRequestState:从状态存储中检索会话状态。如果您要构建自己的状态管理模块,请同步此事件以从您的
* 状态存储中抓取会话状态。
* • PreRequestHandlerExecute:此事件在执行 HTTP 处理程序之前发生。
* • PostRequestHandlerExecute:此事件在执行 HTTP 处理程序之后发生。
* • ReleaseRequestState:将会话状态重新存储在状态存储中。如果您要构建一个自定义会话状态模块,则必须将您
* 的状态重新存储在状态存储中。
* • UpdateRequestCache:此事件将输出重新写入输出缓存。如果您要构建自定义缓存模块,则可以将输出重新写入
* 缓存中。
* • EndRequest:请求已完成。您可能希望构建一个调试模块,以便将整个请求的信息收集到一起,然后将信息写入
* 页面中。对于每个请求传输,模块都可以与下列事件同步。这些事件的顺序不是固定的。
* • PreSendRequestHeaders:此事件在发送标头之前发生。如果您要添加其他标头,则可以通过自定义模块同步此事件。
* • PreSendRequestContent:此事件在调用 Response.Flush 方法时发生。如果您要添加其他内容,则可以通过自定
* 义模块同步此事件。
* • Error:此事件在出现未处理的异常时发生。如果您要编写自定义的错误处理程序,请同步此事件。
以下为示例:
public class Sample1HttpHandles:IHttpHandler
{
public Sample1HttpHandles()
{
}
public void ProcessRequest(HttpContext context)
{
//string url = context.Request.QueryString["u"];
//context.Response.Redirect(url);
//context.Response.End();
context.Response.Write("<H1>This is an HttpHandler Test.</H1>");
context.Response.Write("<p>Your Browser:</p>");
context.Response.Write("Type: " + context.Request.Browser.Type + "<br>");
context.Response.Write("Version: " + context.Request.Browser.Version);
}
public bool IsReusable
{
get { return true; }
}
}