---IIS API HttpHandler HttpModule

http://www.cndw.com/tech/net/2006032927823.asp
============
在开发基于Microsoft IIS的应用时,开发者除了可以编写ASP程序外,还可以使用Visual C++等开发工具,开发ISAPI应用,以获取更为强大的功能。可以编写两种ISAPI扩展:一种是ISAPI Server Extention,另一种是ISAPI Filter,但是,ISAPI扩展应用的编写通常对开发者有比较高的要求,开发和部署的难度比较大。
在开发ASP.Net应用时,我们仍然可以编写ISAPI应用,以扩充IIS的功能,但是,ASP.Net为我们提供了另外一种选择——使用HTTP Handler 和HTTP Module。这是通过使用IHttpHandler 和 IHttpModule接口来实现的。
HTTP Handler提供了类似于ISAPI Server Extention的功能,而HttpModule实现了类似于ISAPI Filter的功能,并且,比ISAPI,在开发和部署上都要简单的多。
应用HttpHandler和HttpModule,使应用程序可以与IIS Web服务器的低级别请求和响应服务交互
本文首先介绍HttpHandler和HttpModule的概念和基本使用方法,并介绍了一个应用HttpModule实现权限系统的案例。
=======================================
HTTP 处理管道的基本模型
要对HttpModule和IHttpHandler进行研究,必须先对ASP.Net的处理管道有一个了解。
在ASP.Net应用程序中,系统使用一组相关的类,
通过一定的顺序来处理客户端的请求(Request),
ASP.NET应用程序的处理模式可称之为HTTP处理管道。

HttpModule和IHttpHandler就是这个处理管道上的两个处理环节。

HTTP处理管道中的类在System.Web名称空间中定义,主要有以下类型:
· HttpWorkerRequest 抽象类定义了ASP.Net页面处理请求的基本方法;
· HttpRuntime 提供了处理应用的一组服务;
· HttpContext 保存了处理一次请求的所有相关上下文信息;
· HttpApplicationFactory 提供相关目录的应用程序;
· HttpApplication 定义了所有ASP.Net应用程序的通用的方法、属性和事件。
    这个类也是在用户在global.asax文件中定义的应用的基类;
· Modules 处理请求前和响应后的事件;
· HandlerFactories 提供应用程序中的Handlers;
· Handlers 处理请求和响应。
HTTP处理管道的模型如下:
HttpProcesPipe
=====================================
在Windows平台上,HTTP Pipeline需要IIS的支持。
为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLLASPNET_WP.EXE
· ASPNET_ISAPI.DLL是一个ISAPI Extention他将发向IIS的请转交ASPNET_WP.EXE处理
· ASPNET_WP.EXE使用HttpRuntime对请求进行具体处理 处理的过程可以用图表示如下
OnIISHttpProcessPipe
======================================
HttpHandler的实现
HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。
HttpHandler功能的实现通过实现IHttpHandler接口来达到。
实际上,我们在编写ASP.Net页面时,
ASP.Net页面所继承的基类—System.Web.UI.Page—也实现了HttpHandler接口,
也是一个HttpHandler,看一下它的定义就知道了(C#):
public class Page : TemplateControl, IHttpHandler  
接口IHttpHandler的定义如下:
interface IHttpHandler
{
   
void ProcessRequest(HttpContext ctx);
   
bool IsReuseable { get; }
}

接口中ProcessRequest是添加自己的代码,进行相应处理的地方。
IsReuseable属性指明该HttpHandler的实现类是否需要缓存。
下面的示例展示了HttpHandler的基本使用:
1、建立一个名为MyNameSpace的工程,添加一个类,名称为MyHandler,代码如下:
例1:

========

Code

=========
2、将上面的代码编译,生成MyNameSpace.Dll文件;
3、建立一个新的WebApplication项目,或打开一个WebApplication项目,将文件MyNameSpace.Dll添加到项目的引用中,或复制到项目的bin目录下;
4、修改Web.Config,添加如下内容:

<configuration>
<system.web>
  <httpHndlers>
   <add verb="*" path="*.aspx" type="MyNameSpace.MyHandr, MyNameSpace" />
   </httpHndlers>
  </system.web>
</configuration>
配置文件中的选项说明:
· verb可以是"GET"或"POST",表示对GET或POST的请求进行处理。"*"表示对所有请求进行处理。
· Path指明对相应的文件进行处理,"*.aspx"表示对发给所有ASPX页面的请求进行处理。可以指明路径,如"/test/*.aspx",表明只对test目录下的ASPX文件进行处理。
· Type属性中,逗号前的字符串指明HttpHandler的实现类的类名,后面的字符串指明Dll文件的名称

现在,请求项目中的任何ASPX页面,页面上显示的始终只有如下一行字:
This is my handler
效果如下:
SD_Effect1
============

因为,我们自定义的Handler截获了所有发向ASPX页面的请求并且用自己的的方法来处理这些请求了
为了使我们的ASPX页面能够顺利运行,我们需要修改Web.Config文件:
<httpHandlers>
         
<add verb="*" path="*.foo" type="MyNameSpace.MyHandler, MyNameSpace" />
</httpHandlers>

<configuration>
<system.web>
  <httpHndlers>
   <add verb="*" path="*.foo" type="MyNameSpace.MyHandr,MyNameSpace" />
  </httpHndlers>
</system.web>
</configuration>

 


为了让对后缀名为.foo的文件的请求能够被我们的Handler截获运行,我们还需要一些额外的工作。
打开IIS的管理控制台,又键单击站点,选择"属性",跳出站点的属性对话框。选择主目录选项。如图3
webSiteProperty
===============================
选择配置,弹出应用程序配置对话框,将".foo"添加到应用程序映射中,如图4:
 AddApplicationMap
===============================
好了,我们现在可以在项目中添加一个.foo文件
(这里最重要,这个.foo文件在VS2005中要以WebForm的方式添加,而不能以其他方式,如txt文档形式添加),
在SharpDeveloper中是这样的:
==================
add_foo ==============

错误的添加方式:
error_add_foo ==========
看到的结果:
add_foo_result
当向该文件发送请求时,浏览器显示:
This is my handler
而对其他ASPX文件的访问不受影响。
*******************************
=========================
*******************************
实现Handler Factory
实现HttpHandler功能的另外一个选择是实现一个Handler Factory
这是通过实现IHttpHandlerFactory接口来实现的。
IHttpHandlerFactory接口的定义如下:

interface IHttpHandlerFactory
{
  IHttpHandler GetHandler(HttpContext ctx,
 
string requestType,
 
string url,
 
string pathTranslated);
 
void ReleaseHandler(IHttpHandler handler);
}


GetHandler方法在请求开始的时候被调用,
而ReleaseHandler在请求结束,所有的Handler都不再需要的时候被调用。

使用HttpHandlerFactory的过程一般如下:
1. 首先定义实际处理HttpHandler的类,
    这个类会在HandlerFactory中被调用以进行实际的处理
   public class BasicHandler:IHttpHandler { ... }
2. 然后,定义自己的HandlerFactory:

public class BasicHandlerFactory:IHttpHandlerFactory
{
  
public IHttpHandler GetHandler(HttpContext ctx,
  
string requestType,
  
string url,
  
string pathTranslated)
   {
     
return new BasicHandler();
   }
  
public void ReleaseHandler(IHttpHandler handler){}
}


最后,在Web.Config文件中注册这个Factory:

<configuration>
<system.web>
  <httpHandlers>
   <add verb="POST" path="*.foo"
type="MyNamespace.BasicHandlerFactory, MyAssembly" />
  </httpHandlers>
</system.web>
</configuration>


异步Handler
通过实现IHttpAsyncHandler可以实现对HTTP请求的异步处理。
IHttpAsyncHandler接口继承IHttpHandler,
也需要实现ProcessRequest 方法和 IsReusable 属性,
同时,
需要实现 BeginProcessRequest 和 EndProcessRequest 方法。
================
BeginProcessRequest 启动异步调用以处理单个的 HTTP 请求,
而 EndProcessRequest 则在该进程结束时执行清理代码。

IHttpAsyncHandler的实现和注册同IHttpHandler类似,读者可以参考MSDN的相关文档。
现在,大家是否对HTTP Handler的概念和应用有了一定的了解?
在下一篇文章中,我们将主要介绍HTTP Module的的应用,并给出使用HttpModule实现权限系统的实例。 

posted on 2009-05-07 21:35  simhare  阅读(573)  评论(0编辑  收藏  举报

导航