艾伟:ASP.NET内部原理(HttpHandler和HttpModule)

  在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释后的数据流返回给客户端浏览器。其实ASP.DLL是一个依附在IIS的ISAPI文件,它负责了对诸如ASP文件,ASA等文件的解释执行,
-------------------------------------
ASP.NET的HTTP请求处理方法
  当客户端向web服务器请求一个*.aspx的页面文件时,同asp类似,这个http请求也会被inetinfo.exe进程截获(www服务),它判断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。
------------------------------------
  当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:
  HttpModule --> HttpHandler Factory --> HttpHandler

  当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。

完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

  如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。
----------------------------------------
  系统本身的HttpModule实现一个IHttpModule的接口,当然我们自己的类也能够实现IHttpModule接口,这就可以替代系统的HttpModule对象了。

ASP.NET系统中默认的HttpModule:

  DefaultAuthenticationModule 确保上下文中存在 Authentication 对象。无法继承此类。
  FileAuthorizationModule 验证远程用户是否具有访问所请求文件的 NT 权限。无法继承此类。
  FormsAuthenticationModule 启用 ASP.NET 应用程序以使用 Forms 身份验证。无法继承此类。
  PassportAuthenticationModule 提供环绕 PassportAuthentication 服务的包装。无法继承此类。
  SessionStateModule   为应用程序提供会话状态服务。
  UrlAuthorizationModule   提供基于 URL 的授权服务以允许或拒绝对指定资源的访问。无法继承此类。
  WindowsAuthenticationModule 启用 ASP.NET 应用程序以使用 Windows/IIS 身份验证。无法继承此类

--------------------------------------
  这些系统默认的HttpModule是在文件machine.config中配置的,和我们开发时使用到的web.config的关系是:是在ASP.NET FRAMEWORK启动处理一个Http Request的时候,它会依次加载machine.config和请求页面所在目录的web.config文件,如果在machine中配置了一个自己的HttpModule,你仍然可以在所在页面的web.config文件中remove掉这个映射关系。

Code
public class HelloWorldModule : IHttpModule
{
    public HelloWorldModule()
    {
    }

    public String ModuleName
    {
        get { return "HelloWorldModule"; }
    }

    // In the Init function, register for HttpApplication 
    // events by adding your handlers.
    public void Init(HttpApplication application)
    {
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));
        application.EndRequest += 
            (new EventHandler(this.Application_EndRequest));
    }

    private void Application_BeginRequest(Object source, 
         EventArgs e)
    {
    // Create HttpApplication and HttpContext objects to access
    // request and response properties.
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("

 HelloWorldModule: Beginning of Request


");
    }

    private void Application_EndRequest(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("

HelloWorldModule: End of Request

");
    }

    public void Dispose()
    {
    }
}

 
-----------------------------------------------------------------------------------
深入HttpModule

  一个Http请求在被ASP.NET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在HttpHandler中执行完成后,HttpHandler会再次将控制权交还给HttpModule

  上面的代码中的HttpModule的Init()中的参数是HttpApplication类型,它具有许多事件,包括BeginRequest,EndRequest,AuthentiacteRequest 等等。
-----------------------------------------------------------------
IHttpHandler

  它是asp.net Framework提供的一个接口,定义了如果要实现一个Http请求的处理所需要必须实现的一些系统约定。也就是说,如果你想要自行处理某些类型的HTTP请求信息流的话,你需要实现这些系统约定才能做到。譬如一个*.aspx文件,用来处理此类型的Http请求,ASP.NET FRAMEWORK将会交给一个名为System.Web.UI.PageHandlerFactory的HttpHandler类来处理。

  HH和HM一样,系统会在最初始由ASP.NET FRAMEWORK首先加载machine.config中的HttpHandler,而后会加载Web应用程序所在目录的web.config中的用户自定义的HttpHandler类。但是系统与我们自定义的HH之间的关系是"覆盖"的,也就是说如果我们自定义了一个针对"*.aspx"的HttpHandler类的话,那么系统会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理,而我们自己的HttpHandler类则需要自己完全解析这个Http请求,并作出处理。
IHttpHandler接口中最重要的方法ProcessRequest,这个方法就是HttpHandler用来处理一个Http请求,当一个Http请求经过由HttpModule容器传递到HttpHandler容器中的时候,framework会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理。

  framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的IHttpHandler容器之上的,而是定位到了其 内部默认的IHttpHandler Factory上了。IHttpHandler Factory的作用就是对很多系统已经实现了的IHttpHandler容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。

加拿大达内急招2009届毕业生

时间: 2024-10-30 16:04:07

艾伟:ASP.NET内部原理(HttpHandler和HttpModule)的相关文章

ASP.NET内部原理(HttpHandler和HttpModule)

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释后的数据流返回给客户端浏览器.其实ASP.DLL是一个依附在IIS的ISAPI文件,它负责了对诸如ASP文件,ASA等文件的解释执行,-------------------------------------ASP.NET的HTTP请求处理方法 当客户端向

Asp.NET中 HttpHandler、HttpModule深入分析

在我们 .NET web.config 的配置文件中经常会看到HttpHandler与HttpModule这两个词,那么你真正理解这两个词吗?下面就给大家讲解一下HttpHandler.HttpModule的作用和应用. 什么是IHttpHandler? IHttpHandler定义了实现HTTP请求的一些基本约定,简单理解就是配置一个HttpHandler就实现了一个URL请求.如果一个IHttpHandler定义了其实现类,那么就相当于是覆盖关系. IHttpHandler的使用方法 Htt

httphandler和httpmodule的区别

ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览 器中. 生命周期中涉及到几个非常重要的对象:HttpHandler,HttpModule,IHttpHandlerFactory,他们的执行(顺序)大致的执行过程是这样的:client端发送页面请求,被IIS的某个进程截获

关于HttpHandler与HttpModule的理解和应用方法_实用技巧

神秘的HttpHandler与HttpModule        大学时候我是从拖控件开始学习asp.net的,对.net的很多类库对象都不是很了解.所以看到大家写一些个性的asp.net名词,就感觉asp.net总有一层神秘的面纱笼罩着,让我琢磨不透,相信园子里面也有很多和我经历差不多的.net攻城师.在以前看HttpHandler与HttpModule都是神秘莫测的.哈哈,今天我为大家展示下我对他的理解,以及应用.       也许你不懂HttpHandler与HttpModule(大侠Re

HttpHandler与HttpModule的用处与区别

HttpHandler与HttpModule的用处与区别 问题1:什么是HttpHandler? 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什么时候使用HttpModule? 答案1:HttpHandler,Http请求的处理者,例如ScriptHandler.WebServiceHandler,IHttpHandler的实现都是为了处理某一类的请求.如ScriptHandler负责处理对脚本的请求. 答案2:HttpModule,Http模块.实际上就

Asp.Net中的HttpHandler

Asp.Net中的HttpHandler 很多时候,我们新建一个xxx.aspx页和xxx.aspx.cs文件,不过是为了实现一个很简单的功能,如:输出xmlDom,注销并跳转,并没有什么html的输出,很是麻烦,需要新建一个页,删除多余的html,并在page_load里面写处理代码.而使用HttpHandler就不需要这么麻烦了. 可以用任何符合公共语言规范 (CLS) 的语言编写自定义 HTTP 处理程序来处理特定的.预定义类型的 HTTP 请求.响应这些特定请求的是在 HttpHandl

系统-硬盘分区内部原理????

问题描述 硬盘分区内部原理???? 一块硬盘可以分为4个主分区,而系统在其中的一个分区中,那么这个分区就需要主导扇区来引导已经分区表来确定,不同系统的分区格式有可能不一样,现在一个硬盘要把分成几个区是要用的分区表来确定吗? 解决方案 无论操作系统和文件系统是怎样的,分区表.引导记录是公认的标准.所谓硬盘可以分为4个分区已经是老皇历了,现在的PC使用UEFI固件和新的GUID分区表,可以分无数的分区. 解决方案二: 为此,可以贴两篇科普文帮你扫盲下http://wenku.baidu.com/li

Android GUI系统之SurfaceFlinger(5) BufferQueue内部原理

1.1 BufferQueue详解 上一小节我们已经看到了BufferQueue,它是SurfaceTextureClient实现本地窗口的关键.从逻辑上来推断,BufferQueue应该是驻留在SurfaceFlinger这边的进程中.我们需要进一步解决的疑惑是: 每个应用程序可以对应几个BufferQueue,它们是一对一.多对一或者是一对多? 应用程序所需要的绘图空间是由谁分配的? 在音频系统的学习中,我们知道AudioTrack和AudioFlinger是通过共享内存的形式来进行数据传递

Oracle update的内部原理

用ORACLE内部原理描述以下过程: 1.sqlplus user/passwd@orcl 2.update t set a=1 where b='ss'; 3.commit; 4.exit 1.sqlplus user/passwd@orcl (1).客户端SQLPLUS连接监听 (2).监听收到连接请求,Fork一个Oracle进程,作为服务器进程,同时分配一小块PGA内存. (3).服务器进程和客户端建立连接. (4).服务器进程(以下简称进程)查询USER$.PROFILE$等数据字典,