当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.Net中自定义Http处理及应用之HttpHandler篇

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 145 ::
收藏到网摘: n/a

在开发基于MicrosoftIIS的应用时,开发者除了可以编写ASP程序外,还可以使用VisualC++等开发工具,开发ISAPI应用,以获取更为强大的功能。可以编写两种ISAPI扩展:一种是ISAPIServerExtention,另一种是ISAPIFilter,但是,ISAPI扩展应用的编写通常对开发者有比较高的要求,开发和部署的难度比较大。在开发ASP.Net应用时,我们仍然可以编写ISAPI应用,以扩充IIS的功能,但是,ASP.Net为我们提供了另外一种选择——使用HTTPHandler和HTTPModule。这是通过使用IHttpHandler和IHttpModule接口来实现的。HTTPHandler提供了类似于ISAPIServerExtention的功能,而HttpModule实现了类似于ISAPIFilter的功能,并且,比ISAPI,在开发和部署上都要简单的多。应用HttpHandler和HttpModule,使应用程序可以与IISWeb服务器的低级别请求和响应服务交互。本文首先介绍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处理管道的模型如下:


图1:HTTP处理管道

在Windows平台上,HTTPPipline需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE·ASPNET_ISAPI.DLL是一个ISAPIExtention他将发向IIS的请转交ASPNET_WP.EXE处理·ASPNET_WP.EXE使用HttpRuntime对请求进行具体处理处理的过程可以用图表示如下:


图2:IIS上的HTTP处理管道

HttpHandler的实现

HttpHandler实现了类似于ISAPIExtention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。实际上,我们在编写ASP.Net页面时,ASP.Net页面所继承的基类——System.Web.UI.Page——也实现了HttpHandler接口,也是一个HttpHandler,看一下它的定义就知道了(C#):
publicclassPage:TemplateControl,IhttpHandler

接口IHttpHandler的定义如下:



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

例1:


namespaceMyNameSpace
{
publicclassMyHandler:IHttpHandler
{
publicvoidProcessRequest(HttpContextctx)
{
HttpResponseResponse
Response.Write("Thisismyhandler");}
publicboolIsReusable
{
get{returntrue;}
}
}
}

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


<configuration>
<system.web>
<httpHndlers>
<addverb="*"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页面,页面上显示的始终只有如下一行字:


Thisismyhandler

因为,我们自定义的Handler截获了所有发向ASPX页面的请求,并且用自己的的方法来处理这些请求了。为了使我们的ASPX页面能够顺利运行,我们需要修改Web.Config文件:


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

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

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

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


Thisismyhandler


而对其他ASPX文件的访问不受影响。

实现HandlerFactory

实现HttpHandler功能的另外一个选择是实现一个HandlerFactory,这是通过实现IHttpHandlerFactory接口来实现的。IHttpHandlerFactory接口的定义如下:


interfaceIHttpHandlerFactory
{
IHttpHandlerGetHandler(HttpContextctx,
stringrequestType,
stringurl,
stringpathTranslated);
voidReleaseHandler(IHttpHandlerhandler);
}

GetHandler方法在请求开始的时候被调用,而ReleaseHandler在请求结束,所有的Handler都不再需要的时候被调用。使用HttpHandlerFactory的过程一般如下:首先定义实际处理HttpHandler的类,这个类会在HandlerFactory中被调用以进行实际的处理:


publicclassBasicHandler:IHttpHandler{...}

然后,定义自己的HandlerFactory:


publicclassBasicHandlerFactory:IHttpHandlerFactory
{
publicIHttpHandlerGetHandler(HttpContextctx,
stringrequestType,
stringurl,
stringpathTranslated)
{
returnnewBasicHandler();
}
publicvoidReleaseHandler(IHttpHandlerhandler){}
}

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


<configuration>
<system.web>
<httpHandlers>
<addverb="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的相关文档。现在,大家是否对HTTPHandler的概念和应用有了一定的了解?在下一篇文章中,我们将主要介绍HTTPModule的的应用,并给出使用HttpModule实现权限系统的实例。