设为首页收藏本站language 语言切换
查看: 1338|回复: 0
收起左侧

ASP.Net中自定义Http处理及应用之HttpHandler篇

[复制链接]
发表于 2010-2-25 10:27:19 | 显示全部楼层 |阅读模式
<p >在开发基于Microsoft IIS的应用时,开发者除了可以编写ASP程序外,还可以使用Visual C++等开发工具,开发ISAPI应用,以获取更为强大的功能。可以编写两种ISAPI扩展:一种是ISAPI Server Extention,另一种是ISAPI Filter,但是,ISAPI扩展应用的编写通常对开发者有比较高的要求,开发和部署的难度比较大。<p >在开发ASP.Net应用时,我们仍然可以编写ISAPI应用,以扩充IIS的功能,但是,ASP.Net为我们提供了另外一种选择——使用HTTP Handler 和HTTP Module。这是通过使用IHttpHandler 和 IHttpModule接口来实现的。HTTP Handler提供了类似于ISAPI Server Extention的功能,而HttpModule实现了类似于ISAPI Filter的功能,并且,比ISAPI,在开发和部署上都要简单的多。<p >应用HttpHandler和HttpModule,使应用程序可以与IIS Web服务器的低级别请求和响应服务交互。本文首先介绍HttpHandler和HttpModule的概念和基本使用方法,并介绍了一个应用HttpModule实现权限系统的案例。<p ><center><font color="#000099"><strong>HTTP 处理管道的基本模型</strong></font></center><p >要对HttpModule和IHttpHandler进行研究,必须先对ASP.Net的处理管道有一个了解。<p >在ASP.Net应用程序中,系统使用一组相关的类,通过一定的顺序来处理客户端的请求(Request),ASP.NET应用程序的处理模式可称之为HTTP处理管道。HttpModule和IhttpHandler就是这个处理管道上的两个处理环节。<p >HTTP处理管道中的类在System.Web名称空间中定义,主要有以下类型:<p >· HttpWorkerRequest 抽象类定义了ASP.Net页面处理请求的基本方法;<p >· HttpRuntime 提供了处理应用的一组服务;<p >· HttpContext 保存了处理一次请求的所有相关上下文信息;<p >· HttpApplicationFactory 提供相关目录的应用程序;<p >· HttpApplication 定义了所有ASP.Net应用程序的通用的方法、属性和事件。这个类也是在用户在global.asax文件中定义的应用的基类;<p >· Modules 处理请求前和响应后的事件;<p >· HandlerFactories 提供应用程序中的Handlers;<p >· Handlers 处理请求和响应。<p >HTTP处理管道的模型如下:<p ><center><img  src="http://www.hh010.com/upload_files/article/244/9_pnl2xq55185.gif"></center><p ><center>图1:HTTP 处理管道</center><p >在Windows平台上,HTTP Pipline需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE<p >· ASPNET_ISAPI.DLL是一个ISAPI Extention他将发向IIS的请转交ASPNET_WP.EXE处理<p >· ASPNET_WP.EXE使用HttpRuntime对请求进行具体处理<p >处理的过程可以用图表示如下:<p ><center><img  src="http://www.hh010.com/upload_files/article/244/9_eqjwsr55186.gif"></center><p ><center>图2:IIS上的HTTP处理管道</center><p ><center><font color="#000099"><strong>HttpHandler的实现</strong></font></center><p >HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。实际上,我们在编写ASP.Net页面时,ASP.Net页面所继承的基类——System.Web.UI.Page——也实现了HttpHandler接口,也是一个HttpHandler,看一下它的定义就知道了(C#):<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>public class Page : TemplateControl, IhttpHandler</ccid_code></pre></td></tr></table></ccid_nobr><p >接口IHttpHandler的定义如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>interface IHttpHandler{void ProcessRequest(HttpContext ctx);bool IsReuseable { get; }}</ccid_code></pre></td></tr></table></ccid_nobr><p >接口中ProcessRequest是添加自己的代码,进行相应处理的地方。IsReuseable属性指明该HttpHandler的实现类是否需要缓存。<p >下面的示例展示了HttpHandler的基本使用:<p >1、建立一个名为MyNameSpace的工程,添加一个类,名称为MyHandler,代码如下:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>例1:namespace MyNameSpace{public class MyHandler : IHttpHandler{public void ProcessRequest(HttpContext ctx){HttpResponse ResponseResponse.Write(&quot;This is my handler&quot;);}public bool IsReusable { get { return true; } }}}</ccid_code></pre></td></tr></table></ccid_nobr><p >2、将上面的代码编译,生成MyNameSpace.Dll文件;<p >3、建立一个新的WebApplication项目,或打开一个WebApplication项目,将文件MyNameSpace.Dll添加到项目的引用中,或复制到项目的bin目录下;<p >4、修改Web.Config,添加如下内容:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>&lt;configuration&gt;                     &lt;system.web&gt;                        &lt;httpHndlers&gt;&lt;add verb=&quot;*&quot; path=&quot;*.aspx&quot; type=&quot; MyNameSpace.MyHandr, MyNameSpace&quot; /&gt;                            &lt;/httpHndlers&gt;&lt;/system.web&gt;&lt;/configuration&gt;</ccid_code></pre></td></tr></table></ccid_nobr><p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-10 15:54 , Processed in 0.121598 second(s), 22 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表