帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程
ASP.NET中的Http Handles
作者:possible_Y 发布时间:2005-03-12 来源:ASPCOOL
     一、关于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。
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·[ASP.NET] Session 详解  (2005-03-12)
 ·如何在命令行下编译一个asp.net项  (2005-03-12)
 ·使用反射将业务对象绑定到 ASP.N  (2005-03-12)
 ·提高ASP.Net应用程序性能的十大方  (2005-03-12)
 ·提高ASP.Net应用程序性能的十大方  (2005-03-12)
 ·ASP.NET中数据库数据导入Excel并  (2005-03-12)
 ·ASP.NET中数据库数据导入Excel并  (2005-03-12)
 ·ATL Server 与 ASP.NET  (2005-03-12)
 ·ASP.NET 2.0 中改进的缓存功能  (2005-03-12)
 ·ASP.NET 2.0中的登陆控件简介(3  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统