zoukankan      html  css  js  c++  java
  • HTTP 处理管道的基本模型

    要对HttpModule和IHttpHandler进行研究,必须先对ASP.Net的处理管道有一个了解。

    在ASP.Net应用程序中,系统使用一组相关的类,通过一定的顺序来处理客户端的请求(Request),ASP.NET应用程序的处理模式可称之为HTTP处理管道。HttpModule和IhttpHandler就是这个处理管道上的两个处理环节。

    HTTP处理管道中的类在System.Web名称空间中定义,主要有以下类型:

    · HttpWorkerRequest 抽象类定义了ASP.Net页面处理请求的基本方法;

    · HttpRuntime 提供了处理应用的一组服务;

    · HttpContext 保存了处理一次请求的所有相关上下文信息;

    · 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:
    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; } 
    }
    }
    }


    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>


    异步Handler


    通过实现IHttpAsyncHandler可以实现对HTTP请求的异步处理。IHttpAsyncHandler接口继承IHttpHandler,也需要实现ProcessRequest 方法和 IsReusable 属性,同时,需要实现 BeginProcessRequest 和 EndProcessRequest 方法。BeginProcessRequest 启动异步调用以处理单个的 HTTP 请求,而 EndProcessRequest 则在该进程结束时执行清理代码。

    IHttpAsyncHandler的实现和注册同IHttpHandler类似,读者可以参考MSDN的相关文档。

    现在,大家是否对HTTP Handler的概念和应用有了一定的了解?在下一篇文章中,我们将主要介绍HTTP Module的的应用,并给出使用HttpModule实现权限系统的实例。

  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/goooto/p/1591104.html
Copyright © 2011-2022 走看看