* HTTP 模块和 HTTP 处理程序是 ASP.NET 体系结构的组成部分。在对一个请求进行处理时,由多个 HTTP 模块
(例如,身份验证模块和会话模块)处理每个请求,然后再由单个 HTTP 处理程序来处理。处理程序处理请求之后,
该请求再通过 HTTP 模块流转回来。
* HTTP 模块:
HTTP 模块是一个在每次针对应用程序发出请求时调用的程序集。HTTP 模块作为 ASP.NET 请求管线的一部分调用,
能够在整个请求过程中访问生命周期事件。因此,HTTP 模块使您有机会检查传入和传出的请求,并根据该请求采
取操作。本节中的主题提供有关 HTTP 模块的工作原理以及如何创建 HTTP 模块的信息。
HTTP 模块在执行处理程序前后调用。模块使开发人员可以截获、参与或修改各个请求。模块实现 IHttpModule
接口,该接口位于 System.Web 名称空间中。
* HttpModule实现了ISAPI Filter的功能,是通过对IhttpModule接口的继承来处理。
*
* IHttpModule:向实现类提供模块初始化和处置事件。
* IHttpModule公共方法
Dispose:处置由实现 IHttpModule 的模块使用的资源(内存除外)。
Init:初始化模块,并使其为处理请求做好准备。
*
* 创建 HTTP 模块:
要创建 HTTP 模块,必须实现 IHttpModule 接口。IHttpModule 接口具有两种方法,并带有下列签名:
void Init(HttpApplication);
void Dispose();
*
* 配置 HTTP 模块:
Web.config配置:(此例子用命名空间+类名和模块名注册该模块)
通用配置:
<httpModules>
<add name="HttpModule的名称" type="命名空间 + 类名,程序集名称"/>
...
</httpModules>
//
先了解一下IIS系统。它是一个程序,负责对网站的内容进行管理并且处理对客户的请求做出反应。当用户对一个页面
提出请求时,IIS做如下反应(不考虑权限问题):
1.把对方请求的虚拟路径转换成物理路径
2.根据物理路径搜索请求的文件
3.找到文件后,获取文件的内容
4.生成Http头信息。
5.向客户端发送所有的文件内容:首先是头信息,然后是Html内容,最后是其它文件的内容(如图片、JS等)。
6.客户端IE浏览器获得信息后,解析文件内容,找出其中的引用文件,如.js .css .gif等,向IIS请求这些文件。
7.IIS获取请求后,发送文件内容。
8.当浏览器获取所有内容后,生成内容界面,客户就看到图像/文本/其它内容了。
*HttpApplication:
HttpApplication:定义 ASP.NET 应用程序中的所有应用程序对象通用的方法、属性和事件。
此类是用户在 global.asax 文件中所定义的应用程序的基类。
HttpApplication 类提供有大量事件,模块可以与这些事件同步。对于每个请求,模块都可以与下列事件同步。这些
事件是按先后顺序列出的:
* • BeginRequest:请求已开始。如果您需要在请求刚开始时执行某些操作(例如在每页的顶部显示广告横幅),请同步
* 此事件。
* • AuthenticateRequest:如果您要插入自己自定义的身份验证方案(例如,在数据库中查找用户以验证密码),请构
* 建一个模块以同步此事件并按您需要的方式验证用户身份。
* • AuthorizeRequest:此事件用于内部实现授权机制(例如,将您的访问控制列表 (ACL) 存储在数据库中而不是文件
* 系统中)。虽然您可以覆盖此事件,但是最好不要这样做。
* • ResolveRequestCache:此事件确定是否可以从输出缓存中调用某个页面。如果您要编写自己的缓存模块(例如,
* 构建基于文件的缓存,而不是内存缓存),请同步此事件以确定是否从缓存中调用页面。
* • AcquireRequestState:从状态存储中检索会话状态。如果您要构建自己的状态管理模块,请同步此事件以从您的
* 状态存储中抓取会话状态。
* • PreRequestHandlerExecute:此事件在执行 HTTP 处理程序之前发生。
* • PostRequestHandlerExecute:此事件在执行 HTTP 处理程序之后发生。
* • ReleaseRequestState:将会话状态重新存储在状态存储中。如果您要构建一个自定义会话状态模块,则必须将您
* 的状态重新存储在状态存储中。
* • UpdateRequestCache:此事件将输出重新写入输出缓存。如果您要构建自定义缓存模块,则可以将输出重新写入
* 缓存中。
* • EndRequest:请求已完成。您可能希望构建一个调试模块,以便将整个请求的信息收集到一起,然后将信息写入
* 页面中。对于每个请求传输,模块都可以与下列事件同步。这些事件的顺序不是固定的。
* • PreSendRequestHeaders:此事件在发送标头之前发生。如果您要添加其他标头,则可以通过自定义模块同步此事件。
* • PreSendRequestContent:此事件在调用 Response.Flush 方法时发生。如果您要添加其他内容,则可以通过自定
* 义模块同步此事件。
* • Error:此事件在出现未处理的异常时发生。如果您要编写自定义的错误处理程序,请同步此事件。
以下为示例:
/// <summary>
/// HelloWorldModule 创建自定义 HTTP 模块类
/// </summary>
public class HelloWorldModule : IHttpModule
{
public HelloWorldModule()
{
}
#region 属性
public string ModuleName
{
get { return "HelloWorldModule"; }
}
#endregion
#region Init--初始化模块,并使其为处理请求做好准备
/// <summary>
/// In the Init function, register for HttpApplication events by adding your handlers.
/// </summary>
/// <param name="application"></param>
public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
application.EndRequest += new EventHandler(this.Application_EndRequest);
}
#endregion
// Create HttpApplication and HttpContext objects to access
// request and response properties.
#region Application_BeginRequest
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<h1><font color='red'>HelloWorldModule:Beginning of Request</font></h1><hr>");
}
#endregion
#region Application_EndRequest
private void Application_EndRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
//context.Response.Write("<h1><font color='red'>HelloWorldModule:End of Request</font></h1><hr>");
context.Response.Write("<h1><font color='red'>HelloWorldModule:End of Request</font></h1><hr>");
context.Response.Write("<script language='JavaScript'>alert('HttpModule测试');</script>");
}
#endregion
#region Dispose--处置由实现 IHttpModule 的模块使用的资源(内存除外)。
/// <summary>
/// Dispose--处置由实现 IHttpModule 的模块使用的资源(内存除外)。
/// </summary>
public void Dispose()
{
}
#endregion
}