首页 > 编程 > .NET > 正文

ASP.NET中的Http Handles

2024-07-10 12:57:47
字体:
来源:转载
供稿:网友
菜鸟学堂:
一、关于http handles
asp.net的请求过程是基于一个管道(pipeline)模型的,asp.net会把所有的http请求(requests)都发送给这个管道里的http组件(modules)。每个组件在接收到http请求后进行一些相应的动作。当http请求通过了所有的http modules程序后,将会被交由一个http handle程序来处理,处理后的结果又将通过管道里http modules返回。这整个过程中,被调用的http module可以有多个,然而调用的http handle只能是一个。其过程如图:



可以看出每个输入的http请求都会最终被一个http handle程序处理。http handle是一个实现了system.web.ihttphandler接口的类的实例,有些类似isapi扩展。在http handles中实现的有:
processrequest:该方法用来处理http请求,是http handles最核心的方法
isreusable:一个属性,返回一个bool值,来表示这http handle的实例是否能被重用来处理多个同类型的http请求。

二、在配置文件中注册http handles
http handles的类可以在web.config或machine.config文件里注册。这样,一旦有相应的http请求输入,这个http handle类就会被实例化。在web.config或machine.config文件里我们用<httphandlers>和<add>节点来为我们的应用程序添加http handle类:
<httphandlers>
<add verb="supported http verbs" path="path" type="namespace.classname, assemblyname" />
<httphandlers>

在<add>里
1、verb属性说明了该handle所支持的http请求方式,例如支持post和get方式,verb属性则为"post,get";如果支持所有的请求方式,verb属性则用"*"。
2、path属性说明了对哪些文件的请求才调用该handle来处理,例如你只想在请求my.possible文件时才调用该handle,则path属性为"my.possible",如果你想所有后缀名为possible的文件(*.possible)都由该handle来处理,则path属性为"*.possible"。
3、type属性中指定了handle类的命名空间、类名和配件名(工程名)。asp.net runtime会首先到应用程序的bin目录下查找该配件的dll,如果没有找到再到gac里查找。

其实asp.net自身里的许多功能也是使用http handlers来实现,asp.net使用了许多的handle类来处理.aspx, .asmx, .soap 和一些其它的asp.net文件。你可以在machine.config文件里找到如下代码:
<httphandlers>
<add verb="*" path="trace.axd" type="system.web.handlers.tracehandler"/>

<add verb="*" path="*.aspx" type="system.web.ui.pagehandlerfactory"/>

<add verb="*" path="*.ashx" type="system.web.ui.simplehandlerfactory"/>

<add verb="*" path="*.config" type="system.web.httpforbiddenhandler"/>

<add verb="get,head" path="*" type="system.web.staticfilehandler"/>

. . . . . .
. . . . . .
</httphandlers>
从上面的配置可以看出来对.aspx文件的请求是交由system.web.ui.pagehandlerfactory类来处理的,而象.config文件是被system.web.httpforbiddenhandler类来处理,可以猜想这个类将会返回一个该类文件不能被请求的错误。

三、http handles类的实现
在这里我们用c#来创建一个新的handle类来处理新的文件类型,比如以.possible为后缀名的文件。
1、我们先在vs.net里创建web应用程序的工程,名为myhandler,然后添加一个类文件newhandler.cs来建立实现了ihttphandler接口的类:

using system;
using system.web;

namespace myhandler
{
/// <summary>
/// summary description for newhandler.
/// </summary>
public class newhandler : ihttphandler
{
public newhandler()
{
//
// todo: add constructor logic here
//
}

#region implementation of ihttphandler
public void processrequest(system.web.httpcontext context)
{
httpresponse objresponse = context.response ;
objresponse.write("<html><body><br><br><center>hi,this is a test! ") ;
objresponse.write("</center></body></html>") ;
}

public bool isreusable
{
get
{
return true;
}
}
#endregion
}
}
在processrequest方法的实现里,我们只是简单的获取了httpcontext的httpresponse对象,并象客户端发送了一些html。在isreusable的实现里返回true,表示该handle类的实例可以处理多个对.possible文件的请求。

注意:如果想在http handlers里使用session,那么还需要实现irequiressessionstate接口,而irequiressessionstate接口只是一个标志,不需要实现任何的具体方法,所以只需要把类申明改为:public class newhandler : ihttphandler,irequiressessionstate即可。

2、打开web.config文件,注册上面新创建的handle类:
<httphandlers>
<add verb="*" path="*.possible" type="myhandler.newhandler,myhandler"/>
</httphandlers>

3、在iis中添加isapi扩展,将我们的新后缀名.possible添加进去,具体过程为:
iis--》选中“默认网站”点右键--》选“属性”--》“主目录”--》“配置”--》点“映射”里的“添加”按钮--》在弹出对话框里点击“浏览”按钮,选择aspnet_isapi.dll文件,并在扩展名里填possible,如下图所示:



最后点击确定按钮。

这样我们就可以在浏览器里输入http://localhost/myhandler/xxx.possible,来调用该handle了。当然我们这里只是举了个简单例子,所以输入任何*.possible都是一样的效果。我们可以在newhandler的processrequest方法里先分析请求的url,然后根据不同url作出不同的相应,比如跳转到不同的真实存在的aspx页面,这也正是web设计模式中mvc模式在asp.net中通过front controller实现的核心部分之一,具体请见:http://msdn.microsoft.com/architecture/patterns/default.aspx?pull=/library/en-us/dnpatterns/html/desfrontcontroller.asp。

上一篇:.NET概观

下一篇:Asp.net性能优化总结(二)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表