首先要明白什么是http处理程序(what),处理程序用于处理各个终结点请求,处理程序使ASP.NET框架可以处理应用程序内的单组 HTTP URL 或成组的 URL 扩展,与模块不同,只有一个处理程序用于处理请求,所有的处理程序都必须实现IHttpHandler接口,该接口位于system。Web命名空间下,处理程序在某些方面与Internet服务器应用程序编程接口(ISAPI)扩展类似。就是相当于一个Http管道扩展的组件。
下面是一个http处理程序的举例:
using System;
using System.Collections.Generic;
using
System.Linq;
using System.Web;
namespace MasterTest
{
///
<summary>
///
处理.sample为拓展名的请求,该文件不必实际存在
///
</summary>
public class
SampleHandler:IHttpHandler
{
///
<summary>
///
是否可重复使用,true可重复使用,即常驻内存,false表示不可重用
/// </summary>
public bool IsReusable
{
get { return false; }
}
///
<summary>
///
处理请求
///
</summary>
///
<param
name="context">请求上下文</param>
public void ProcessRequest(HttpContext
context)
{
HttpRequest request =
context.Request;
HttpResponse Response =
context.Response;
Response.Write("<html>");
Response.Write("<body>");
Response.Write("<h1>这是一个自定义请求处理类</h1>");
Response.Write("</body>");
Response.Write("</html>");
}
}
}
配置文件如下
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.sample"
type="MasterTest.SampleHandler"/>
</httpHandlers>
</system.web>
</configuration>
Http模块在执行处理程序前后调用。模块使开发人员可以截获、参与或修改各个请求。模块实现 IHttpModule 接口,该接口位于System.Web 名称空间中。
HttpApplication 类提供有大量事件,模块可以与这些事件同步。对于每个请求,模块都可以与下列事件同步。这些事件是按先后顺序列出的:
- BeginRequest:请求已开始。如果您需要在请求刚开始时执行某些操作(例如在每页的顶部显示广告横幅),请同步此事件。
- AuthenticateRequest:如果您要插入自己自定义的身份验证方案(例如,在数据库中查找用户以验证密码),请构建一个模块以同步此事件并按您需要的方式验证用户身份。
- AuthorizeRequest:此事件用于内部实现授权机制(例如,将您的访问控制列表 (ACL) 存储在数据库中而不是文件系统中)。虽然您可以覆盖此事件,但是最好不要这样做。
- ResolveRequestCache:此事件确定是否可以从输出缓存中调用某个页面。如果您要编写自己的缓存模块(例如,构建基于文件的缓存,而不是内存缓存),请同步此事件以确定是否从缓存中调用页面。
- AcquireRequestState:从状态存储中检索会话状态。如果您要构建自己的状态管理模块,请同步此事件以从您的状态存储中抓取会话状态。
- PreRequestHandlerExecute:此事件在执行 HTTP 处理程序之前发生。
- PostRequestHandlerExecute:此事件在执行 HTTP 处理程序之后发生。
- ReleaseRequestState:将会话状态重新存储在状态存储中。如果您要构建一个自定义会话状态模块,则必须将您的状态重新存储在状态存储中。
- UpdateRequestCache:此事件将输出重新写入输出缓存。如果您要构建自定义缓存模块,则可以将输出重新写入缓存中。
- EndRequest:请求已完成。您可能希望构建一个调试模块,以便将整个请求的信息收集到一起,然后将信息写入页面中。
对于每个请求传输,模块都可以与下列事件同步。这些事件的顺序不是固定的。
- PreSendRequestHeaders:此事件在发送标头之前发生。如果您要添加其他标头,则可以通过自定义模块同步此事件。
- PreSendRequestContent:此事件在调用 Response.Flush 方法时发生。如果您要添加其他内容,则可以通过自定义模块同步此事件。
- Error:此事件在出现未处理的异常时发生。如果您要编写自定义的错误处理程序,请同步此事件。
HTTP模块就相对于一个ISAPI滤波
ASP.Net请求原理概述:
ASP.NET请求处理过程是基于管道模型的,在模型中ASP.NET把http请求传递给管道的各个模块,每个模块都接收http请求并拥有完全控制权限。模块可以用任何自认为合适的方式处理请求,一旦请求通过了所有的Http模块,就最终被HTTP处理程序处理。之后http处理程序将对请求进行一些处理,并把结果再次经过管道中的http模块。
特别注意的是http请求的处理过程中,只能调用一个Http处理程序,然而可以调用多个http模块。
可以使用web.config或者machine.config文件把这些类映射到http请求上。映射完成以后,当接收到相应请求的时候ASP.NET会实例化http处理程序。我们将解释如何在web.config和/或machine.config文件中定义所有这些细节信息。
ASP.NET还通过IHttpHandlerFactory接口支持http处理程序的扩展。ASP.NET提供了把http请求路由到实现IHttpHandlerFactory接口的类的对象上的能力。此外,ASP.NET还利用了Factory设计模式。这种模式为建立一组相关对象而不提供具体类的功能提供了接口。简单的说,你可以把用于建立依赖传递进来的参数建立的http处理程序对象的类看作是factory(工厂)。我们不用指定需要实例化的特定的http处理程序;http处理程序工厂处理这种事务。这样做的优点在于如果未来实现IHttpHandler接口的对象的实现方法发生了改变,只要接口仍然相同,客户端就不会受到影响。