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

在开发基于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的定义如下:


interfaceIHttpHandler
{
voidProcessRequest(HttpContextctx);
boolIsReuseable{get;}
}

接口中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实现权限系统的实例。

时间: 2024-10-04 15:28:27

ASP.Net中自定义Http处理及应用之HttpHandler篇的相关文章

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

asp.net HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response).HttpHandler功能的实现通过实现IHttpHandler接口来达到.而HttpModule实现了类似于ISAPI Filter的功能.   HttpModule的实现HttpModules实现了类似于ISAPI Filter的功能,在开发上,通常需要经过以下步骤: 1.编写一个类,实现IhttpModule接口 2.实现Init 方法,

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

asp.net   在开发基于Microsoft IIS的应用时,开发者除了可以编写ASP程序外,还可以使用Visual C++等开发工具,开发ISAPI应用,以获取更为强大的功能.可以编写两种ISAPI扩展:一种是ISAPI Server Extention,另一种是ISAPI Filter,但是,ISAPI扩展应用的编写通常对开发者有比较高的要求,开发和部署的难度比较大. 在开发ASP.Net应用时,我们仍然可以编写ISAPI应用,以扩充IIS的功能,但是,ASP.Net为我们提供了另外一种

asp.net中的窗体身份验证(最简单篇)_实用技巧

在创建网站中,常常会使用到身份验证.asp.net中内置了几种身份验证的方式,如Windows.Froms.Passport等.这几种身份验证的方式各有不同.一般来说,网站的身份验证方式都会经过以下几个步骤: 1.输入用户名和密码,单击确定按钮. 2.在后台判断用户名和密码是否正确,如果错误返回提示:如果正确,进入可访问的页面.  在ASP时代,通常都会在验证用户名和密码是否匹配之后,创建一个Session,然后在每个需要验证的页面中判断Session是否存在,如果存在,则显示页面内容:如果不存

自定义Http处理及应用之HttpHandler篇

在开发基于Microsoft IIS的应用时,开发者除了可以编写ASP程序外,还可以使用Visual C++等开发工具,开发ISAPI应用,以获取更为强大的功能.可以编写两种ISAPI扩展:一种是ISAPI Server Extention,另一种是ISAPI Filter,但是,ISAPI扩展应用的编写通常对开发者有比较高的要求,开发和部署的难度比较大. 在开发ASP.Net应用时,我们仍然可以编写ISAPI应用,以扩充IIS的功能,但是,ASP.Net为我们提供了另外一种选择--使用HTTP

ASP.NET中自定义DataGrid分页设置的实现

asp.net|datagrid|分页 我实现了DataGrid的个性化分页,现在把代码贴出来朋友们参考,同时在这个功能的实现过程,参考了"飞刀"从国外翻译的一篇文章. 先定义ASPX页面,注意AllowCustomPaging要设为"False": <body><form id="DictList" method="post" runat="server"><TABLE st

asp.net中使用cookie传递参数的方法

  asp.net中使用cookie传递参数的方法          这篇文章主要介绍了asp.net中使用cookie传递参数的方法,涉及asp.net针对cookie传值与接收的技巧,需要的朋友可以参考下 本文实例讲述了asp.net中使用cookie传递参数的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 //传值 HttpCookie cookie = new HttpCookie("mycookie"); cookie.Value = "

ASP.net中实现基于UrlRewrite的防盗链功能

 这篇文章主要介绍了ASP.net中如何实现基于UrlRewrite的防盗链,需要的朋友可以参考下 在ASP.net中最快实现UrlRewrite的方法这篇文章中说了如何做UrlRewrite,那只是一个最简单的应用    其实利用UrlRewrite与IIS的设置我们可以实现简单而有效的防盗链功能.    假设你的站点有一个文件:web.rar,你希望只有具有某些特定域名的来源地址或是已经登陆的用户才能访问,这时就得用到防盗链功能,在ASP时代,我们需要借助第三方组件来完成这个效果,但是在AS

ASP.net中实现基于UrlRewrite的防盗链功能_实用技巧

在ASP.net中最快实现UrlRewrite的方法这篇文章中说了如何做UrlRewrite,那只是一个最简单的应用 其实利用UrlRewrite与IIS的设置我们可以实现简单而有效的防盗链功能. 假设你的站点有一个文件:web.rar,你希望只有具有某些特定域名的来源地址或是已经登陆的用户才能访问,这时就得用到防盗链功能,在ASP时代,我们需要借助第三方组件来完成这个效果,但是在ASP.net中我们可直接利用Context.RewritePath来实现了. 下载配置文件: 复制代码 代码如下:

ASP.NET中利用DataGrid的自定义分页功能

asp.net|datagrid|分页 ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页 ASP.Net中的DataGrid有内置分页功能, 但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页, 这种只选取了一小部分而丢掉大部分的方法是不可去取的. 在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现