一、关于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--》选中“默认网站”点右键--》选“属性”--》“主目录”--》“配置”--》点“映射”里的“添加”按钮--》在弹出对话框里点击“浏览”按钮,选择as.net_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。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器