Http模块和http处理程序

首先要明白什么是http处理程序(what),处理程序用于处理各个终结点请求,处理程序使ASP.NET框架可以处理应用程序内的单组 HTTP URL 或成组的 URL 扩展,与模块不同,只有一个处理程序用于处理请求,所有的处理程序都必须实现IHttpHandler接口,该接口位于system。Web命名空间下,处理程序在某些方面与Internet服务器应用程序编程接口(ISAPI)扩展类似。就是相当于一个Http管道扩展的组件。

下面是一个http处理程序的举例:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

 

namespace MasterTest
{
    /// <summary>
    /// 处理.sample为拓展名的请求,该文件不必实际存在
    /// </summary>
    public class SampleHandler:IHttpHandler
    {
        /// <summary>
        /// 是否可重复使用,true可重复使用,即常驻内存,false表示不可重用
        /// </summary>
        public bool IsReusable
        {
            get { return false; }
        }
        /// <summary>
        /// 处理请求
        /// </summary>
        /// <param name="context">请求上下文</param>
        public void ProcessRequest(HttpContext context)
        {
            HttpRequest request = context.Request;
            HttpResponse Response = context.Response;
            Response.Write("<html>");
            Response.Write("<body>");
            Response.Write("<h1>这是一个自定义请求处理类</h1>");
            Response.Write("</body>");
            Response.Write("</html>");
        }
    }
}

配置文件如下

<?xml version="1.0"?>
<configuration>

    <system.web>
     
      <httpHandlers>
        <add verb="*" path="*.sample" type="MasterTest.SampleHandler"/>
      </httpHandlers>
    </system.web>
 
 
</configuration>

 

Http模块在执行处理程序前后调用。模块使开发人员可以截获、参与或修改各个请求。模块实现 IHttpModule 接口,该接口位于System.Web 名称空间中。

HttpApplication 类提供有大量事件,模块可以与这些事件同步。对于每个请求,模块都可以与下列事件同步。这些事件是按先后顺序列出的:

  • BeginRequest:请求已开始。如果您需要在请求刚开始时执行某些操作(例如在每页的顶部显示广告横幅),请同步此事件。
  • AuthenticateRequest:如果您要插入自己自定义的身份验证方案(例如,在数据库中查找用户以验证密码),请构建一个模块以同步此事件并按您需要的方式验证用户身份。
  • AuthorizeRequest:此事件用于内部实现授权机制(例如,将您的访问控制列表 (ACL) 存储在数据库中而不是文件系统中)。虽然您可以覆盖此事件,但是最好不要这样做。
  • ResolveRequestCache:此事件确定是否可以从输出缓存中调用某个页面。如果您要编写自己的缓存模块(例如,构建基于文件的缓存,而不是内存缓存),请同步此事件以确定是否从缓存中调用页面。
  • AcquireRequestState:从状态存储中检索会话状态。如果您要构建自己的状态管理模块,请同步此事件以从您的状态存储中抓取会话状态。
  • PreRequestHandlerExecute:此事件在执行 HTTP 处理程序之前发生。
  • PostRequestHandlerExecute:此事件在执行 HTTP 处理程序之后发生。
  • ReleaseRequestState:将会话状态重新存储在状态存储中。如果您要构建一个自定义会话状态模块,则必须将您的状态重新存储在状态存储中。
  • UpdateRequestCache:此事件将输出重新写入输出缓存。如果您要构建自定义缓存模块,则可以将输出重新写入缓存中。
  • EndRequest:请求已完成。您可能希望构建一个调试模块,以便将整个请求的信息收集到一起,然后将信息写入页面中。

对于每个请求传输,模块都可以与下列事件同步。这些事件的顺序不是固定的。

  • PreSendRequestHeaders:此事件在发送标头之前发生。如果您要添加其他标头,则可以通过自定义模块同步此事件。
  • PreSendRequestContent:此事件在调用 Response.Flush 方法时发生。如果您要添加其他内容,则可以通过自定义模块同步此事件。
  • Error:此事件在出现未处理的异常时发生。如果您要编写自定义的错误处理程序,请同步此事件。

 HTTP模块就相对于一个ISAPI滤波

ASP.Net请求原理概述: 

  ASP.NET请求处理过程是基于管道模型的,在模型中ASP.NET把http请求传递给管道的各个模块,每个模块都接收http请求并拥有完全控制权限。模块可以用任何自认为合适的方式处理请求,一旦请求通过了所有的Http模块,就最终被HTTP处理程序处理。之后http处理程序将对请求进行一些处理,并把结果再次经过管道中的http模块。

特别注意的是http请求的处理过程中,只能调用一个Http处理程序,然而可以调用多个http模块。

 

可以使用web.config或者machine.config文件把这些类映射到http请求上。映射完成以后,当接收到相应请求的时候ASP.NET会实例化http处理程序。我们将解释如何在web.config和/或machine.config文件中定义所有这些细节信息。

 

ASP.NET还通过IHttpHandlerFactory接口支持http处理程序的扩展。ASP.NET提供了把http请求路由到实现IHttpHandlerFactory接口的类的对象上的能力。此外,ASP.NET还利用了Factory设计模式。这种模式为建立一组相关对象而不提供具体类的功能提供了接口。简单的说,你可以把用于建立依赖传递进来的参数建立的http处理程序对象的类看作是factory(工厂)。我们不用指定需要实例化的特定的http处理程序;http处理程序工厂处理这种事务。这样做的优点在于如果未来实现IHttpHandler接口的对象的实现方法发生了改变,只要接口仍然相同,客户端就不会受到影响。

Http模块和http处理程序

上一篇:CentOS4.5下LVS方案


下一篇:linux LVS (keepalived+ipvsadm)负载均衡搭建