背景:
阅读新闻

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

[日期:2003-08-25] 来源:赛迪网  作者:孙亚民 [字体: ]

配置文件中的选项说明:

· 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:



图3:Web站点属性对话框


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



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

作者介绍:孙亚民,毕业于南京大学,苏州某软件公司技术总监,熟悉.Net和J2EE架构,以及UML和Rational Rose,您可以到作者专栏与他交流。
收藏 推荐 打印 | 录入:木鸟 | 阅读:
相关新闻      
本文评论   [发表评论]   全部评论 (0)
热门评论