zoukankan      html  css  js  c++  java
  • ASP.Net中自定义Http处理及应用之HttpHandler

     在开发基于Microsoft IIS的应用时,开发者除了可以编写ASP程序外,还可以使用Visual C 等开发工具,开发ISAPI应用,以获取更为强大的功能。可以编写两种ISAPI扩展:一种是ISAPI Server Extention,另一种是ISAPI Filter,但是,ISAPI扩展应用的编写通常对开发者有比较高的要求,开发和部署的难度比较大。 在开发ASP.Net应用时,我们仍然可以编写ISAPI应用,以扩充IIS的功能,但是,ASP.Net为我们提供了另外一种选择——使用HTTP Handler 和HTTP Module。这是通过使用IHttpHandler 和 IHttpModule接口来实现的。HTTP Handler提供了类似于ISAPI Server Extention的功能,而HttpModule实现了类似于ISAPI Filter的功能,并且,比ISAPI,在开发和部署上都要简单的多。 应用HttpHandler和HttpModule,使应用程序可以与IIS Web服务器的低级别请求和响应服务交互。本文首先介绍HttpHandler和HttpModule的概念和基本使用方法,并介绍了一个应用HttpModule实现权限系统的案例。
    加工:
        httphandler  ----> isapi 服务扩展
        httpmodule  -----> isaspi 过滤
     注:(isapi: internet server application interface 因特网服务程序接口)
    使用httpmodule 可以实现权限和URL重写等于IIS的低级别交互,同时可以将cookie指定作用于全域。

    HTTP 处理管道的基本模型
    要对HttpModule和IHttpHandler进行研究,必须先对ASP.Net的处理管道有一个了解。
     在ASP.Net应用程序中,系统使用一组相关的类,通过一定的顺序来处理客户端的请求(Request),ASP.NET应用程序的处理模式可称之为HTTP处理管道。
    HttpModule和IhttpHandler就是这个处理管道上的两个处理环节。 HTTP处理管道中的类在System.Web名称空间中定义,
    主要有以下类型:

    · HttpWorkerRequest 抽象类定义了ASP.Net页面处理请求的基本方法;
    · HttpRuntime 提供了处理应用的一组服务
    · HttpContext 保存了处理一次请求的所有相关上下文信息(如:request response);
     · HttpApplicationFactory 提供相关目录的应用程序;
    · HttpApplication 定义了所有ASP.Net应用程序的通用的方法、属性和事件。这个类也是在用户在global.asax文件中定义的应用的基类;
    · Modules 处理请求前和响应后的事件;
    · HandlerFactories 提供应用程序中的Handlers;
    · Handlers 处理请求和响应。

    HTTP处理管道的模型如下:

    图1:HTTP 处理管道
    在Windows平台上,HTTP Pipline需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE
    · ASPNET_ISAPI.DLL是一个ISAPI Extention他将发向IIS的请转交ASPNET_WP.EXE处理
    · ASPNET_WP.EXE使用HttpRuntime对请求进行具体处理
    处理的过程可以用图表示如下:

    图2:IIS上的HTTP处理管道

    HttpHandler的实现
    HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。实际上,我们在编写ASP.Net页面时,ASP.Net页面所继承的基类——System.Web.UI.Page——也实现了HttpHandler接口,也是一个HttpHandler,看一下它的定义就知道了(C#):
    public class Page : TemplateControl, IhttpHandler

    接口IHttpHandler的定义如下:

    interface IHttpHandler
    {
    void ProcessRequest(HttpContext ctx);
    bool IsReuseable get; }
    }


     

    接口中ProcessRequest是添加自己的代码,进行相应处理的地方。IsReuseable属性指明该HttpHandler的实现类是否需要缓存。 下面的示例展示了HttpHandler的基本使用: 1、建立一个名为MyNameSpace的工程,添加一个类,名称为MyHandler,代码如下:
    例1:

    2、将上面的代码编译,生成MyNameSpace.Dll文件; 3、建立一个新的WebApplication项目,或打开一个WebApplication项目,将文件MyNameSpace.Dll添加到项目的引用中,或复制到项目的bin目录下; 4、修改Web.Config,添加如下内容:

    <configuration> 
    <system.web>
    <httpHndlers>
    <add verb="*" path="*.aspx" 
    type
    =" MyNameSpace.MyHandr, MyNameSpace" /> 
    </httpHndlers>
    </system.web>
    </configuration>


     

    配置文件中的选项说明:
     
    · verb可以是"GET"或"POST",表示对GET或POST的请求进行处理。"*"表示对所有请求进行处理。
    · Path指明对相应的文件进行处理,"*.aspx"表示对发给所有ASPX页面的请求进行处理。可以指明路径,如"/test/*.aspx",表明只对test目录下的ASPX文件进行处理。
    · Type属性中,逗号前的字符串指明HttpHandler的实现类的类名,后面的字符串指明Dll文件的名称。

    现在,请求项目中的任何ASPX页面,页面上显示的始终只有如下一行字:
    This is my handler


    因为,我们自定义的Handler截获了所有发向ASPX页面的请求,并且用自己的的方法来处理这些请求了。 为了使我们的ASPX页面能够顺利运行,我们需要修改Web.Config文件:

    <configuration> 
    <system.web>
    <httpHndlers>
    <add verb="*" path="*.foo" 
    type
    =" MyNameSpace.MyHandr,hander" /> 
    </httpHndlers>
    </system.web>
    </configuration>


     


    为了让对后缀名为.foo的文件的请求能够被我们的Handler截获运行,我们还需要一些额外的工作。打开IIS的管理控制台,又键单击站点,选择"属性",跳出站点的属性对话框。选择主目录选项。如图3:

    图3:Web站点属性对话框
    选择配置,弹出应用程序配置对话框,将".foo"添加到应用程序映射中,如图4:

    图4:添加应用程序映射
    好了,我们现在可以在项目中添加一个.foo文件,当向该文件发送请求时,浏览器显示:
    This is my handler


    而对其他ASPX文件的访问不受影响。
    实现Handler Factory
    实现HttpHandler功能的另外一个选择是实现一个Handler Factory,这是通过实现IHttpHandlerFactory接口来实现的。 IHttpHandlerFactory接口的定义如下:

    interface IHttpHandlerFactory
    {
    IHttpHandler GetHandler(HttpContext ctx,
    string requestType,
    string url,
    string pathTranslated);
    void ReleaseHandler(IHttpHandler handler);
    }


    GetHandler方法在请求开始的时候被调用,而ReleaseHandler在请求结束,所有的Handler都不再需要的时候被调用。 使用HttpHandlerFactory的过程一般如下: 首先定义实际处理HttpHandler的类,这个类会在HandlerFactory中被调用以进行实际的处理:
    public class BasicHandler : IHttpHandler { ... }


    然后,定义自己的HandlerFactory:

    public class BasicHandlerFactory : IHttpHandlerFactory
    {
    public IHttpHandler GetHandler(HttpContext ctx,
    string requestType,
    string url,
    string pathTranslated)
    {
    return new BasicHandler();
    }

    public void ReleaseHandler(IHttpHandler handler) {}
    }


     


    最后,在Web.Config文件中注册这个Factory:

    <configuration>
    <system.web>
    <httpHandlers>
    <add verb="POST" path="*.foo"
    type
    ="MyNamespace.BasicHandlerFactory, MyAssembly" />
    </httpHandlers>
    </system.web>
    </configuration>

    namespace MyNameSpace
    {
    public class MyHandler : IHttpHandler
    {
    public void ProcessRequest(HttpContext ctx)
    {
    HttpResponse Response
    Response.Write(
    "This is my handler");}

    public bool IsReusable 

    get return true; } 
    }

    }

    }



    加工:
    在实际使用中,经常使用ashx(一般处理文件,功能相当于*.cs 但是可以使用基于http协议的访问!)extends IHttpHandler 来实现一些功能,如返回HTML,XML 等等,通常用于异步操作,即和ajax结合。典型的应有就是Prototype和jQuery。

     
  • 相关阅读:
    python 端口扫描仪
    [ruby on rails] 深入(1) ROR的一次request的响应过程
    [ruby on rails] 跟我学之(10)数据输入验证
    [ruby on rails] 跟我学之(9)删除数据
    [ruby on rails] 跟我学之(8)修改数据
    [ruby on rails] 跟我学之(7)创建数据
    BZOJ 2301 [HAOI2011]Problem b (分块 + 莫比乌斯反演)
    BZOJ 2005 [Noi2010]能量采集 (数学+容斥 或 莫比乌斯反演)
    BZOJ 1497 [NOI2006]最大获利 (最小割)
    BZOJ [FJOI2007]轮状病毒 (找规律)
  • 原文地址:https://www.cnblogs.com/sntetwt/p/2032212.html
Copyright © 2011-2022 走看看