关于HttpModule和HttpHandler

记得很久以前就看到过一篇文章,说搞不懂HttpModule,HttpHandler和HttpContext的算不上好的ASP.NET程序员。由此看来,在此之前我都算不上一个好的ASP.NET程序员。

要想搞清楚上面的几个东西,首先就要搞清楚当一个HttpRequest发送到服务器之后,服务器是怎么处理这个Request并且将处理的结果返回给客户端。在ASP.NET中,当一个HttpRequest到达服务器时,它会首先被inetinfo.exe截获,然后转交给ASPNET_ISAPI.dll处理。而ASPNET_ISAPI.dll则将请求转送到一个HttpPipeline的管道里面,ASPNET_WP.exe进程会接到请求并把它交给HttpRuntime来处理。如下图



那么请求在这个HttpRuntime里面又怎么工作呢?我们可以用下面的这个流程来表示:

HttpRequest ----> HttpApplicationFactory ----> 生成一个HttpApplication实例 ----> HttpModule ----> HttpHandlerFactory ----> HttpHandler ----> 生成结果传输回客户端,在这里我们已经可以看到HttpModule和HttpHandler了!

首先我们看HttpModule,它到底是做什么用的呢?
MSDN上的定义:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconHttpModules.asp
从中可以看到我们可以自定义编程HttpModule来实现对HttpRequest中的内容做一个处理或者过滤。下面的链接中可以转向一个MSDN的例子:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconcustomhttpmodules.asp,具体我这里就不多说了。

具体在这个例子中,我们可以看到我们是通过在IHttpModule接口中的Init方法中注册HttpApplication中的BeginReqeust和EndRequest事件来使我们可以在不同的阶段处理不同的事情。但是实际上,HttpApplication中包含了更多的事件,见MSDN链接:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfsystemwebhttpapplicationclasstopic.asp

再看HttpHanlder,先回顾一下上面讲到的HttpApplication中的那些事件:

[执行处理程序。]

PostRequestHandlerExecute

当进入到这个步骤时,HttpModule开始将Request转移给HttpHandler来处理,处理完的结果再转交给HttpModule发回到客户端。那么HttpHandler又怎么工作呢?其实跟HttpModule差不多,都是通过实现IHttpHanler接口,然后在web.config中注册自己的Handler来执行。

关于这个如何执行以及例子都可以参考MSDN,我想那边的可能更好懂一点。链接:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconaspnetrequestprocessing.asp

 最后关于HttpContext,它是在HttpApplication的实例创建出来之后就一直存在着,可以方便你的去访问HttpRequest中的一些信息。但是需要注意的是在使用里面的一些对象之前建议先弄明白里面一些对象的生命周期,否则可能会引发异常。更多的信息可以参考《ASP.NET Framework深度历险》一书。

关于实践:DNN中大量使用了自定义的HttpModule和HttpHandler来处理这些东西,所以如果有条件不妨去研究DNN,看看这些东西到底能为我们做些什么。

参考资料:
《ASP.NET Framework深度历险》
《DotNetNuke Friendly Urls》
MSDN
http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/BuildSucApp/BSAAsecmodsecmod37.mspx?mfr=true

posted @ 2006-06-08 11:36    阅读(1840)  评论(1编辑  收藏  举报