HttpContext, HttpModules 和 HttpHandlers

原创 2007年10月10日 11:35:00
  httpApplication它本身对发送给应用程序的数据一无所知-它只是一个通过事件来通讯的消息对象.它触发事件并通过HttpContext对象来向被调用函数传递消息.实际的当前请求的状态数据由前面提到的HttpContext对象维护.它提供了所有请求专有的数据并从进入管道开始到结束一直跟随请求.图7显示了ASP.NET管道中的流程.注意上下文对象(即HttpContext),这个从请求开始到结束一直都是你”朋友”的对象,可以在一个事件处理函数中保存信息并在以后的事件处理函数中取出.
  
    一旦管道被启动,HttpApplication开始象图六那样一个个的触发事件.每个事件处理器被触发,如果事件被挂接,这些处理器将执行它们自己的任务.这个处理的主要任务是最终调用挂接到此特定请求的HttpHandler.处理器(handler)是ASP.NET请求的核心处理机制,通常也是所有应用程序级别的代码被执行的地方.记住ASP.NET页面和Web服务框架都是作为HttpHandler实现,这里也是处理请求的的核心之处.模块(module)趋向于成为一个传递给处理器(handler)的上下文的预处理或后处理器.ASP.NET中典型的默认处理器包括预处理的认证,缓存以及后处理中各种不同的编码机制.
  
    有很多关于HttpHandler和HttpModule的可用信息,所以为了保持这篇文章在一个合理的长度,我将提供一个关于处理器的概要介绍.

HttpModule
  
    当请求在管道中传递时,HttpApplicaion对象中一系列的事件被触发.我们已经看到这些事件在Global.asax中作为事件被发布.这种方法是特定于应用程序的,可能并不总是你想要的.如果你要建立一个通用的可用被插入任何Web应用程序的HttpApplication事件钩子,你可用使用HttpModule,这是可复用的,不需要特定语应用程序代码的,只需要web.config中的一个条目.
  
    模块本质上是过滤器(fliter)-功能上类似于ISAPI过滤器,但是它工作在ASP.NET请求级别上.模块允许为每个通过HttpApplication对象的请求挂接事件.这些模块作为外部程序集中的类存贮.,在web.config文件中被配置,在应用程序启动时被载入.通过实现特定的接口和方法,模块被挂接到HttpApplication事件链上.多个HttpModule可用被挂接在相同的事件上,事件处理的顺序取决于它们在Web.config中声明的顺序.下面是在Web.config中处理器定义.
  
  <configuration>
  <system.web>
  <httpModules>
  <add name= "BasicAuthModule"
  type="HttpHandlers.BasicAuth,WebStore" />
  </httpModules>
  </system.web>
  </configuration>
  
    注意你需要指定完整的类型名和不带dll扩展名的程序集名.
  
    模块允许你查看每个收到的Web请求并基于被触发的事件执行一个动作.模块在修改请求和响应数据方面做的非常优秀,可用为特定的程序提供自定义认证或者为发生在ASP.NET中的每个请求增加其他预处理/后处理功能.许多ASP.NET的功能,像认证和会话(Session)引擎都是作为HttpModule来实现的.
  
    虽然HttpModule看上去很像ISAPI过滤器,它们都检查每个通过ASP.NET应用的请求,但是它们只检查映射到单个特定的ASP.NET应用或虚拟目录的请求,也就是只能检查映射到ASP.NET的请求.这样你可以检查所有ASPX页面或者其他任何映射到ASP.NET的扩展名.你不能检查标准的.HTM或者图片文件,除非你显式的映射这些扩展名到ASP.NET ISAPI dll上,就像图1中展示的那样.一个常见的此类应用可能是使用模块来过滤特定目录中的JPG图像内容并在最上层通过GDI+来绘制’样品’字样.
  
    实现一个HTTP模块是非常简单的:你必须实现之包含两个函数(Init()和Dispose())的IHttpModule接口.传进来的事件参数中包含指向HTTPApplication对象的引用,这给了你访问HttpContext对象的能力.在这些方法上你可以挂接到HttpApplication事件上.例如,如果你想挂接AuthenticateRequest事件到一个模块上,你只需像列表5中展示的那样做
  
    列表5:基础的HTTP模块是非常容易实现的
  
  public class BasicAuthCustomModule : IHttpModule
  {
   public void Init(HttpApplication application)
   {
    // *** Hook up any HttpApplication events
    application.AuthenticateRequest += new EventHandler(this.OnAuthenticateRequest);
   }
   public void Dispose() { }
  
   public void OnAuthenticateRequest(object source, EventArgs eventArgs)
   {
    HttpApplication app = (HttpApplication) source;
    HttpContext Context = HttpContext.Current;
    … do what you have to do… }
   }
  
    记住你的模块访问了HttpContext对象,从这里可以访问到其他ASP.NET管道中固有的对象,如请求(Request)和响应(Response),这样你还可以接收用户输入的信息等等.但是记住有些东西可能是不能访问的,它们只有在处理链的后段才能被访问.
  
    你可以在Init()方法中挂接多个事件,这样你可以在一个模块中实现多个不同的功能.然而,将不同的逻辑分到单独的类中可能会更清楚的将模块进行模块化(译注:这里的模块化和前面的模块没有什么关系)在很多情况下你实现的功能可能需要你挂接多个事件-例如一个日志过滤器可能在BeginRequest事件中记录请求开始时间,然后在EndRequest事件中将请求结束写入到日志中.
  
    注意一个HttoModule和HttpApplication事件中的重点:Response.End()或HttpApplication.CompleteRequest()会在HttpApplication和Module的事件链中”抄近道”.看”注意Response.End()”来获得更多信息.
  
    注意Response.End()
  
    当创建HttpModule或者在Global.asax中实现事件钩子的时候,当你调用Response.End或 Appplication.CompleteRequest的时候要特别注意.这两个函数都结束当前请求并停止触发在HTTP管道中后续的事件,然后发生将控制返回到Web服务器中.当你在处理链的后面有诸如记录日志或对内容进行操作的行为时,因为他们没有被触发,有可能使你上当.例如,sample中logging的例子就会失败,因为如果调用Response.End()的话,EndRequest事件并不会被触发

 

web.config中的HttpContext, HttpModules 和 HttpHandlers

导读:   HttpApplication触发事件来通知你的程序有事发生,以此来负责请求流转.这作为HttpApplication.Init()函数的一部分发生(用Reflector查看System....
  • cici5000
  • cici5000
  • 2008年01月28日 09:49
  • 287

web.config中的HttpContext, HttpModules 和 HttpHandlers

HttpApplication触发事件来通知你的程序有事发生,以此来负责请求流转.这作为HttpApplication.Init()函数的一部分发生(用Reflector查看System.Web.Ht...
  • Allan168
  • Allan168
  • 2006年12月05日 09:50
  • 872

HttpHandlers httpModules

ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI.dll,AS...
  • Any_421
  • Any_421
  • 2011年04月25日 16:17
  • 168

httpModules与httpHandlers之httpModules

项目中httpModules应用: WapModule.cs: public class WapModule:IHttpModule {    public void Init(Htt...
  • alisa525
  • alisa525
  • 2012年09月20日 09:04
  • 403

httpModules与httpHandlers之httpHandlers

HttpHandler   HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中...
  • alisa525
  • alisa525
  • 2012年09月20日 09:19
  • 355

httpHandlers和httpModules深度剖析

ASP.NET对请求处理的过程: 当请求一 个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dl...
  • xfajsw
  • xfajsw
  • 2012年01月11日 17:18
  • 461

asp.net HttpModules与HttpHandlers .

ASP.NET对请求处理的过程:   当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI.dl...
  • raokaichuan
  • raokaichuan
  • 2012年02月18日 17:26
  • 686

HttpHandlers和HttpModules接口详解

http://www.cnblogs.com/123clb/archive/2011/01/20/1940182.html 本文介绍httpHandlers和httpModules接口介绍。 ASP....
  • gahetgidt
  • gahetgidt
  • 2011年01月22日 13:20
  • 259

HttpHandlers、HttpModules介绍

HttpHandlers、HttpModules介绍HttpHandlers 和 HttpModules 通过扩展原始的页面框架,提供了用于处理请求和响应的两种途径。HttpHanders的主要目的是...
  • tuolingss
  • tuolingss
  • 2010年05月28日 16:08
  • 1148

httphandlers 与 httpmodules

    HttpHandlers 和 HttpModules 通过扩展原始的页面框架,提供了用于处理请求和响应的两种途径。HttpHanders的主要目的是处理对某种特定文件或者在URL中对某个文件路...
  • tudanhust
  • tudanhust
  • 2010年05月12日 10:57
  • 224
收藏助手
不良信息举报
您举报文章:HttpContext, HttpModules 和 HttpHandlers
举报原因:
原因补充:

(最多只允许输入30个字)