ASP.NET中的Http Handler

原创 2004年04月02日 15:46:00

一、关于http handler
    ASP.NET的请求过程是基于一个管道(pipeline)模型的,ASP.NET会把所有的http请求(Requests)都发送给这个管道里的http组件(modules)。每个组件在接收到http请求后进行一些相应的动作。当http请求通过了所有的http modules程序后,将会被交由一个http handler程序来处理,处理后的结果又将通过管道里http modules返回。这整个过程中,被调用的http module可以有多个,然而调用的http handler只能是一个。其过程如图:

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

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

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

其实ASP.NET自身里的许多功能也是使用HTTP handlers来实现,ASP.NET使用了许多的handler类来处理.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 handler类的实现
    在这里我们用C#来创建一个新的handler类来处理新的文件类型,比如以.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,表示该handler类的实例可以处理多个对.possible文件的请求。

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

2、打开web.config文件,注册上面新创建的handler类:
<httpHandlers>
  <add verb="*" path="*.possible" type="MyHandler.NewHandler,MyHandler"/>
</httpHandlers>

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

最后点击确定按钮。

这样我们就可以在浏览器里输入http://localhost/MyHandler/xxx.possible,来调用该handler了。当然我们这里只是举了个简单例子,所以输入任何*.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

Asp.Net 构架(Http Handler 介绍)

引言 在 Part.1 Http请求处理流程 一文中,我们了解了Http请求的处理过程以及其它一些运作原理。我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttp...
  • u013089389
  • u013089389
  • 2014年01月23日 10:37
  • 654

【C#.NET】Http Handler 介绍

转自:http://www.cnblogs.com/cuishao1985/archive/2009/09/25/1573962.html Http Handler 介绍 引言 在 Pa...
  • shellching
  • shellching
  • 2013年02月22日 16:47
  • 6007

C#-Handler 技术介绍

最近接触到了.Net的Handler技术,百度到了这篇介绍的比较详细的文章,虽说已经比较早了,但很多东西还是有价值的。 VS2010添加该文件的方法:Web项目中,添加新项目,Visual C#,W...
  • shellching
  • shellching
  • 2013年02月22日 16:37
  • 7777

File Upload using jQuery AJAX in ASP.NET Web API or Http handler (AJAX上传文件通过Web API或 http handler)

AJAX上传文件通过Web API或 http handler Upload file using jQuery AJAX in ASP.NET Web API This articl...
  • kingmax54212008
  • kingmax54212008
  • 2016年02月11日 08:20
  • 1412

在WinForm中通过HTTP协议向服务器端上传文件

相信用ASP.NET写一个上传文件的网页,大家都会写,但是有没有人想过通过在WinForm中通过HTTP协议上传文件呢?有些人说要向服务器端上传文件,用FTP协议不是很简单吗?效率又高,为什么还要使用...
  • walkinhill
  • walkinhill
  • 2004年08月28日 22:03
  • 11480

golang http.handler接口详解

golang http.handler接口详解 1.标准库接口定义 package http type Handler interface { ServeHTTP(w ResponseWri...
  • secretx
  • secretx
  • 2016年06月01日 15:53
  • 6075

在asp.net handler 中 使用 session

想在一般處理程序(handler)中使用session ,需要實現一個不需要實現任何方法的接口IRequiresSessionState 引入 System.Web.SessionState 即可。此...
  • luckysiesteven
  • luckysiesteven
  • 2016年01月13日 17:19
  • 402

使用AddHandler 方法处理已经被处理的事件

所有的UIElement 实例及其子类的实例都有一个AddHandler 方法。通过该方法可以为指定的路由事件添加处理函数,并将该处理程序添加到当前元素的处理程序集合中。 AddHandler 方法有...
  • Libby1984
  • Libby1984
  • 2016年12月12日 11:36
  • 1590

asp.net handler获取session

默认情况下,handler是不能获取到session,只有IRequiresSessionState接口后,就能够获取到session,IRequiresSessionState没有方法,仅是一个标识...
  • penginpha
  • penginpha
  • 2013年03月05日 09:51
  • 2851

C# Handler 下载文件

假设前台服务器和应用服务器分开,前台服务器有N台负责展现,应用服务器部署文件生成服务,应用服务器火墙策略未对所有用户开放,如果要实现前台下载应用服务器生成功能,一种方法可以通过同步服务将应用服务器生成...
  • kangkanglou
  • kangkanglou
  • 2014年12月27日 16:30
  • 1728
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET中的Http Handler
举报原因:
原因补充:

(最多只允许输入30个字)