ASP.NET中的Http Handles

来源:互联网 发布:渭南网络宽带那家好 编辑:程序博客网 时间:2024/06/05 08:54

一、关于http handlesASP.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; ProcessRequest(System.Web.HttpContext context)

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

 

{

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

}

}

原创粉丝点击