HttpModule & HttpHandler
ASP.NET 处理请求的过程
- inetinfo.exe:www 服务进程,IIS 服务 和 ASPNET_ISAPI.dll 都寄存在此进程中。
- ASPNET_ISAPI.dll:处理 .aspx 文件的 win32 组件。其实,IIS 服务器只能识别 .html 文件的,当发现被请求的文件是 .aspx 文件时,IIS 服务器将其交给 aspnet_isapi.dll 来处理。
- aspnet_wp.exe 进程:ASP.NET 框架进程,提供 .net 运行的托管环境,CLR (公共语言运行时)就是寄存在此进程中。
ASP.NET Framework 处理一个 Http Request 的流程:
HttpRequest → inetinfo.exe → ASPNET_ISAPI.dll → ASPNET_WP.exe → HttpRuntime → HttpApplication Factory → HttpApplication → HttpModule → HttpHandler Factory → HttpHandler → HttpHandler.ProcessRequest()
ASP.NET 请求处理过程是基于管道模型的,ASP.NET 把 http 请求依次传递给管道中各个 HttpModule,最终被 HttpHandler 处理,处理完成后,再次经过管道中的 HttpModule,把结果返回给客户端。注意:在 http 请求的处理过程中,只能调用一个 HttpHandler,但可以调用多个 HttpModule。
在每个 HttpModule 中都可以干预请求的处理过程。当请求到达 HttpModule 的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,截获这个请求并作一些额外的工作,或者终止请求等。在 HttpHandler 处理完请求之后,我们也可以再在相应的 HttpModule 中把请求处理的结果进行再次加工后返回客户端。
HttpModule
HttpModule 是实现了 System.Web.IhttpModule 接口的类。IHttpModule 接口的声明:
public interface IHttpModule
{
// 给予 HTTP 模块在对象被垃圾收集之前执行清理的机会,一般无需编写代码。
void Dispose();
// 初始化时自动调用,可在这里向 HttpApplication 对象中的事件注册自己的事件处理程序
void Init(HttpApplication context);
}
HttpModule 可以向 System.Web.HttpApplication 对象注册下面一系列事件(事件触发顺序已排序):
- application_BeginRequest:当 ASP.NET 运行时接收到新的 HTTP 请求时触发。
- application_AuthenticateRequest:当 ASP.NET 运行时准备验证用户身份时触发。
- application_AuthorizeRequest:当 ASP.NET 运行时准备授权用户访问资源的时候触发。
- application_ResolveRequestCache:我们引发这个事件来决定是否可以使用从输出缓存返回的内容来结束请求。但这依赖于 Web 应用程序的输出缓存是怎样设置的。
- application_AcquireRequestState:当 ASP.NET 运行时准备好接收当前 HTTP 请求的会话状态的时候引发这个事件。
- application_PreRequestHandlerExecute:在 ASP.NET 开始执行 HTTP 请求的处理程序之前引发这个事件。在这个事件之后,ASP.NET 把该请求转发给适当的HTTP处理程序。
- application_PostRequestHandlerExecute:在 HTTP 处理程序结束执行的时候引发这个事件。
- application_ReleaseRequestState:当 ASP.NET 结束所有的请求处理程序执行的时候引发这个事件。
- application_EndRequest:把响应内容发送到客户端之前引发这个事件。
- application_PreSendRequestHeaders:在 ASP.NET 把 HTTP 响应头信息发送给客户端之前引发这个事件。在头信息到达客户端之前,这个事件允许我们改变它的内容。我们可以使用这个事件在头信息中添加cookie 和自定义数据。
- application_PreSendRequestContent:在 ASP.NET 把响应内容发送到客户端之前引发这个事件。这个事件允许我们在内容到达客户端之前改变响应内容。我们可以使用这个事件给页面输出添加用于所有页面的内容。例如通用菜单、头信息、脚信息或某些注释与标记。
其余,还有 Error 事件(在处理 HTTP 请求的过程中出现未处理的异常时触发),Deposed 事件(当 ASP.NET 完成 HTTP 请求的处理过程时触发),UpdateRequestCache 事件(当 ASP.NET 完成了当前的 HTTP 请求的处理,并且输出内容已经准备好添加给输出缓存时触发。这依赖于 Web 应用程序的输出缓存是如何设置的)。
HttpModule & HttpHandler 的生命周期图:

HttpModule 使用示例1
有的网站每一个页面都会弹出一个广告或在每个页面都以注释形式(<!-- -->)加入网站的版权信息。如果在每个页面教编写这样的 JS 代码,编写会很繁琐,更改和维护将非常困难。
HttpModule 是客户端发出请求到客户端接收到服务器响应之间的一段必经之路。我们完全可以在服务器处理完请求之后,并在向客户端发送响应文本之前这段时机,把这段注释文字添加到页面文本之后。这样,每一个页面请求都会被附加上这段注释文字。那么,这段代码究竟该在哪个事件里实现呢? PostRequestHandlerExecute 和 PreSendRequestContent 之间的任何一个事件都可以,但一般会在 EndRequest 事件里编写代码,具体实现步骤如下:
- 添加自定义的管道类,并实现 IHttpModule 接口
- 在 Init 事件中注册 EndRequest 事件,实现事件处理方法
- 在 Web.Conofig 中注册自定义 HttpModule
public class TestModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.EndRequest += context_EndRequest;
}
void context_EndRequest(object sender, EventArgs e)
{
((HttpApplication)sender).Response.Write("<!-- 公司版权 -->");
}
}
<httpModules>
<add name="TestModule" type="ASP.NET_Web_Form.Util.TestModule,ASP.NET_Web_Form.Util"/>
</httpModules>
HttpModule 使用示例2
在作登录时,登录成功后,一般要把用户名放在 Session 中保存,在其它每一个页面的 Page_Load 事件中都检查 Session 中是否存在用户名,如果不存在就说明用户未登录,就不让其访问其中的内容。但这种做法实在是太笨拙,几乎要在每一个页面中都加入检测 Session 的代码,导致难以开发和维护。下面我们看看如何使用 HttpModule 来减少我们的工作量。(如果每个页面都有共同的父类,例如 BasePage,那么在父类的 Load 事件中检测也是一样的只需写一次检测代码)
由于这里要用到 Session 中的内容,我们只能在 AcquireRequestState 和 PreRequestHandlerExecute 事件中编写代码,因为在 HttpModule 中只有这两事件中可以访问 Session。这里可以选择PreRequestHandlerExecute 事件编写代码,具体实现比较简单,就不贴代码了。
HttpHandler
HttpHandler 是 HTTP 请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在 HTTP 请求信息流中再次返回到 HttpModule 中。与 HttpModule 不同,一旦定义了自己的HttpHandler 类,那么它对系统的 HttpHandler 的关系将是“覆盖”。
在 web.config 中配置 HttpHandler 节时,你可以指定 HTTP 的动词(GET,POST),指定要处理的资源是什么,以及用什么 HttpHandler 来进行。
另外,如果要在 HttpHandler 中使用 Session,那必须把该 HttpHandler 实现 IRequiresSessionState 接口,IRequiresSessionState 接口是个空接口,它没有抽象方法,只是一个标记接口。
本文参考文献:http://www.cnblogs.com/yuanyuan/archive/2010/11/15/1877709.html
HttpModule & HttpHandler的更多相关文章
- ASP.NET 管道事件与HttpModule, HttpHandler简单理解 -摘自网络
第一部分:转载自Artech IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...
- ASP.NET (HttpModule,HttpHandler)
asp.net 事件模型机制 ----------------------- 一 客户的请求页面由aspnet_isapi.dll这个动态连接库来处理,把请求的aspx文件发送给CLR进行编译执行,然 ...
- ASP.NET三剑客 HttpApplication HttpModule HttpHandler 解析
我们都知道,ASP.Net运行时环境中处理请求是通过一系列对象来完成的,包含HttpApplication,HttpModule, HttpHandler.之所以将这三个对象称之为ASP.NET三剑客 ...
- HttpModule HttpHandler HttpHandlerFactory 学习笔记
1.HttpModule 最常见的是使用HttpModule来做页面权限控制. 在新建类库添加如下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- ASP.NET 管道事件与HttpModule, HttpHandler简单理解
BeginRequest 指示请求处理开始 AuthenticateRequest 封装请求身份验证过程 AuthorizeRequest 封装检查是否能利用以前缓存的输出页面处理请求的过程 Reso ...
- httphandler和httpmodule的区别
ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...
- HttpHandler与HttpModule及实现文件下载
HttpHandler:处理请求(Request)的信息和发送响应(Response).HttpModule:通过Http Module向Http请求输出流中写入文字,httpmodule先执行 它们 ...
- ASP.NET内部原理(HttpHandler和HttpModule)
[IT168 技术文档]在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为 inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请 ...
- 【N年前的文章脑补:HttpHandler HttpModule入门篇】
HttpHandler HttpModule入门篇 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHand ...
随机推荐
- 音频软件消除人声的一点体会(cood edit ,goldwav)
音频软件消除人声的一点体会(cood edit ,goldwav) 使用方法: 1.打开文件 2.命令处理(红色位置可以调整到你认为合适的数据或效果) 3.效果:两个软件均处理后的效果均可以接受.不 ...
- SQL Server 2005中的CTE递归查询得到一棵树
感觉这个CTE递归查询蛮好用的,先举个例子: use City; go create table Tree ( ID int identity(1,1) primary key not null, N ...
- H5的FormData对象完成ajax上传文件multiFile
最近工作中需要完成,ajax上传图片,可是input file +ajax是无法完成的: 于是寻找了许久,发现了H5 的一个对象FormData 使用方法如下: HTML: <form id=& ...
- MATLAB中白噪声的产生
rand产生的是[0,1]上的均匀分布的随机序列randn产生均值为0,方差为1的高斯随机序列,也就是白噪声序列 rand产生的是均匀分布白噪声序列randn产生的是正态分布的白噪声序列 MATLAB ...
- Cardinal样条曲线的Javascript实现(理论篇)
首先,要对样条曲线进行插值的原因是:希望通过给定的关键帧点生成一条希望的直线或者曲线. 1.直线插值 生成一条直线,给定直线首尾的关键点P0,P1,就能确定这条直线的特性,比如y=kx+b中的斜率k和 ...
- jsp提交表单数据乱码,内置对象,以及过滤器
jsp提交表单数据乱码解决方案 通过form表单给服务器提交数据的时候,如果提交的是中文数据,那么可能会出现乱码,如果表单的请求方式是post请求,那么可以使用如下方案解决乱码: 在调用getPara ...
- Page事件执行顺序
Page 执行中将按照如下顺序激活事件: Page.PreInit Page.Init Page.InitComplite Page.PreLoad Page.Load Page.LoadComple ...
- portotype
[ portotype ] [语法] function :function Name是创建新的函数的名称 body : body可以选项,包含调用该函数时被执行的JScrtipt 代码的字符串. ...
- 删除hao123这个恶心的毒瘤
最近做服务器,好好一个东西莫名其妙的被染上了这个狗皮膏药......然后我就用了各种手段删除,注册表.组策略等等都用上了,却没有丝毫办法.....最后发现的地方特别无语,居然在快捷方式的属性中加上了u ...
- Adobe Dreamweaver代码编辑
Adobe Dreamweaver 同义词 DW(Adobe Dreamweaver的缩写)一般指Adobe Dreamweaver Adobe Dreamweaver,简称“DW”,中文名称 &qu ...