Possible的公告
最近评论
hdnero:wow gold
Vista_Jktang:关注!!!
hansenfox:很好的一项技术: 谢谢楼主 ! 还想看




我的体育用品网店:

http://shop33269681.taobao.com
陈建华:有人知道委托的Invoke、beginInvok、endInvok方法的机制吗。
Jack:有点问题,
(1).XMLSocket的方法:

①. connect(服务器地址,端口号) :尝试联接远程计算机
这个方法中第一个参数是不支持非Flash源下载地(IIS服务器)所在的IP的socket连接的,有什么好的解决办法吗?

例外:flash所在的IIS服务器IP为 220.10.10.1那当我从192.168.1.1连接上去后,我……
文章分类
收藏
    相册
    Personal
    Forums
    ASP.NET Forums
    WebSite
    15seconds
    4guysfromrolla
    CodeProject
    devx.com
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 ASP.NET中的Http Handler收藏

    新一篇: .Net里的序列化 | 旧一篇: 网页上数据导出到EXCEL

    一、关于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

    发表于 @ 2004年04月02日 15:46:00|评论(loading...)|编辑

    新一篇: .Net里的序列化 | 旧一篇: 网页上数据导出到EXCEL

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © Possible