HttpModule和HttpHandler(续)

原创 2004年10月21日 16:49:00
上篇讲到HttpModule,再接再厉,找到HttpHandler
作者:孙亚民    本文选自:赛迪网  2002年12月26日
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处理管道的模型如下:

55185.gif


图1:HTTP 处理管道


在Windows平台上,HTTP Pipline需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE

· ASPNET_ISAPI.DLL是一个ISAPI Extention他将发向IIS的请转交ASPNET_WP.EXE处理

· ASPNET_WP.EXE使用HttpRuntime对请求进行具体处理

处理的过程可以用图表示如下:

55186.gif


图2:IIS上的HTTP处理管道


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:
namespace MyNameSpace
{
public class MyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
HttpResponse Response
Response.Write("This is my handler");}
public bool IsReusable 
{ 
get { return true; } 
}
}
}


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


因为,我们自定义的Handler截获了所有发向ASPX页面的请求,并且用自己的的方法来处理这些请求了。

为了使我们的ASPX页面能够顺利运行,我们需要修改Web.Config文件:

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


为了让对后缀名为.foo的文件的请求能够被我们的Handler截获运行,我们还需要一些额外的工作。打开IIS的管理控制台,又键单击站点,选择"属性",跳出站点的属性对话框。选择主目录选项。如图3:

55187.gif


图3:Web站点属性对话框


选择配置,弹出应用程序配置对话框,将".foo"添加到应用程序映射中,如图4:

55188.gif


图4:添加应用程序映射


好了,我们现在可以在项目中添加一个.foo文件,当向该文件发送请求时,浏览器显示:

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的过程一般如下:

首先定义实际处理HttpHandler的类,这个类会在HandlerFactory中被调用以进行实际的处理:

public class BasicHandler : IHttpHandler { ... }


然后,定义自己的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实现权限系统的实例。

ASP.NET-自定义HttpModule与HttpHandler介绍

摘要:本文介绍ASP.NET中自定义HttpModule与HttpHandler,并提供详细的示例代码供参考。     在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍...
  • angel20082008
  • angel20082008
  • 2015年09月12日 12:05
  • 1357

HttpHandler与HttpModule的用处与区别

HttpHandler与HttpModule的用处与区别   问题1:什么是HttpHandler?   问题2:什么是HttpModule?   问题3:什么时候应该使用HttpHan...
  • liuyuliuyu520
  • liuyuliuyu520
  • 2015年09月24日 16:15
  • 351

HttpModule和HttpHandler(续)

上篇讲到HttpModule,再接再厉,找到HttpHandler作者:孙亚民    本文选自:赛迪网  2002年12月26日 HTTP 处理管道的基本模型要对HttpModule和IHttpHan...
  • bgu
  • bgu
  • 2004年10月22日 09:17
  • 735

配置自定义HttpModule、HttpHandler时一定要指定DLL

前几天写了一个自定义的HttpModule,以往WebApp中配置时,把DLL名称忘记了,然后在首次访问网站时就会特别的慢,通过dotTracePerformance跟踪后,发现有一部分性能是浪费在了...
  • bclz_vs
  • bclz_vs
  • 2013年01月21日 18:04
  • 1772

ASP.NET中的HttpModule和HttpHandler

ASP.NET中的HttpModule和HttpHandler
  • zztfj
  • zztfj
  • 2010年07月29日 10:08
  • 2594

HttpHandler和HttpModule理解

最近收到几个疑问:HttpHandler和HttpModule之间有什么差别,我到底该选择哪个?   之所以有这个疑问,是因为在这二类对象中都可以访问Request, Response对象,都能处理...
  • wangqi791975
  • wangqi791975
  • 2015年06月24日 16:01
  • 240

HttpHandler与HttpModule讲解

实现HttpHandler HttpHandler对象必须实现IHttpHandler接口,在HttpApplication对象转交要求至HttpHandler对象时会调用此接口中的init函数,下...
  • byondocean
  • byondocean
  • 2012年01月16日 22:45
  • 1428

二、IIS6.0和7.0区别以及自定义HttpModule、HttpHandler注册

IIS7.0的革新 IIS7.0在请求监听和分发机制上进行了革新性的改进。主要体现在如下2点: Windows进程激活服务(Windows Process Activation Service)W...
  • applewangpai
  • applewangpai
  • 2014年11月27日 23:19
  • 3787

HttpModule,HttpHandler

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程...
  • solovesnow
  • solovesnow
  • 2010年10月19日 15:17
  • 159

关于HttpModule和HttpHandler

记得很久以前就看到过一篇文章,说搞不懂HttpModule,HttpHandler和HttpContext的算不上好的ASP.NET程序员。由此看来,在此之前我都算不上一个好的ASP.NET程序员。要...
  • heqi915
  • heqi915
  • 2007年10月31日 15:36
  • 1262
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HttpModule和HttpHandler(续)
举报原因:
原因补充:

(最多只允许输入30个字)