`
北极的。鱼
  • 浏览: 158979 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

【转自    http://tech.it168.com/a2009/0525/576/000000576820_1.shtml

 

在以前的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掉这个映射关系。

 

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("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");
    }

    private void Application_EndRequest(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
    }

    public void Dispose()
    {
    }
}

 

<system.web>
<httpModules>
   <add name="HelloWorldModule" type="HelloWorldModule"/>
</httpModules>
</system.web>

 深入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容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。

分享到:
评论

相关推荐

    ASP.NET架构详解HttpHandler和HttpModule高清PDF文字版

    在这个主题中,我们将深入探讨ASP.NET架构中的两个关键组件:HttpHandler和HttpModule。 **HttpHandler**是ASP.NET处理HTTP请求的核心组件。每个HTTP请求都会被路由到一个特定的HttpHandler,它负责处理特定类型的...

    .net HttpModle和HttpHandler Demo

    在.NET框架中,HTTP模块(HttpModule)和HTTP处理程序(HttpHandler)是构建Web应用程序的关键组件,它们在ASP.NET的请求处理管道中扮演着重要角色。本篇将深入探讨这两个概念及其在实际开发中的应用。 首先,让...

    ASP.NET 编程模型介绍

    在ASP.NET中,编程模型主要包括HttpApplication、HttpModule、HttpHandler和相关事件的执行顺序。以下是对这些概念的详细解释: 1. **HttpApplication**: - HttpApplication对象是ASP.NET应用程序的核心,它协调...

    rss.rar_ RSS asp.net_RSS asp.net_asp.net_asp.net rss_rss asp.n

    5. **HTTP响应处理**:理解ASP.NET如何通过HttpHandler或HttpModule来处理HTTP请求并生成RSS响应。 6. **自定义RSS输出**:根据项目描述,可能涉及到两种不同的RSS生成逻辑,这将有助于理解在不同场景下如何调整RSS...

    基于ASP.NET的诗词网站.rar

    在ASP.NET中,可以创建自定义的HttpHandler或HttpModule来处理这些请求,或者在控制器(Controller)中添加相应的方法。 前端方面,可以使用ASP.NET AJAX来实现异步提交评论,提高用户体验。AJAX允许在不刷新整个...

    HttpModule和httpHandler学习例子

    HttpModule和HttpHandler是ASP.NET框架中的两个关键组件,它们在处理HTTP请求和响应时扮演着重要角色。这两个概念的理解和应用对于深入掌握ASP.NET的工作原理至关重要。 **HttpModule** HttpModule是ASP.NET中的一...

    自定义Http处理及应用之HttpHandler篇

    HttpHandler 和 HttpModule 在 ASP.Net 应用的自定义 Http 处理和应用中扮演着关键角色。 概述:HttpHandler 和 HttpModule 是 ASP.Net 应用程序中两个重要的组件,它们提供了自定义 Http 处理和应用的能力。...

    asp.net 教学系统

    开发者可能使用ASP.NET的HttpHandler或HttpModule来处理视频请求,实现视频的分段传输和动态码率调整。此外,系统可能还集成了视频转码服务,将不同格式的视频转换为适应网络播放的格式。 课件上传下载功能需要考虑...

    asp.net网络技术

    1. **ASP.NET架构**:ASP.NET框架包括几个关键组件,如ASP.NET页面生命周期、HttpApplication、HttpModule和HttpHandler。页面生命周期管理着从请求到达服务器到响应返回客户端的整个过程,包括初始化、加载、验证、...

    asp.net生成静态页技术源码

    开发者可以通过查看源代码,了解如何在ASP.NET中利用HttpHandler、HttpModule或其他方法来实现这一过程。此外,项目说明和阅读指南可以帮助初学者理解代码的工作原理,从而提升他们的ASP.NET开发技能。

    关于HttpHandler与HttpModule的理解和应用方法

    ASP.NET中的HttpHandler和HttpModule是两种核心组件,它们在应用程序的请求处理管道(Pipeline)中扮演关键角色。本文将深入解析这两个概念及其应用方法,帮助开发者揭开ASP.NET的神秘面纱。 首先,理解ASP.NET的...

    深入挖掘ASP.NET 2.0系列课程(11):ASP.NET 中的静态页生成技术

    在ASP.NET中实现静态页生成,可以通过使用aspnet_compiler工具进行预编译,或者在代码中使用HttpHandler或HttpModule来动态生成静态页。同时,可以结合IIS的URL重写模块,将动态URL映射到静态HTML文件,以达到SEO...

    ASP.NET封装功能整理

    ASP.NET 是微软开发的一款用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地构建动态网站、Web应用和服务。在这个“ASP.NET封装功能整理”中,我们将深入探讨一些关键的ASP.NET特性、组件...

    HttpModule与HttpHandler

    在ASP.NET框架中,HttpModule和HttpHandler是两个至关重要的组件,它们构成了应用程序处理HTTP请求的核心机制。了解这两个概念对于深入理解ASP.NET的工作原理至关重要。 首先,我们来谈谈HttpModule。HttpModule是...

    Asp.Net及相关技术介绍

    此PPT讲述了Asp.Net WebAPI及相关Web服务技术发展历史。 共80多页,Asp.Net WebAPI在讲到第36页的时候才会出现,因为这个技术不是凭空产生的,它有着自己的演变进化的历史。我们要先弄清它从哪里来的?然后再说它能...

    ASP.NET娱乐网站源代码

    在线播放视频可能需要使用流媒体技术,如ASP.NET中的HttpHandler或者HttpModule,配合Flash、HTML5的Video标签或第三方播放器(如JW Player、FlowPlayer)实现。 在线收费模块通常与会员系统结合,实现用户注册、...

    从底层了解ASP.NET体系结构

    ASP.NET 的灵活性在于其管道模型,开发者可以根据需求编写自己的 HttpModule 和 HttpHandler,实现自定义的行为,如日志记录、性能监控、异常处理等。这种模块化的设计使得 ASP.NET 能够处理各种 Web 请求,无论是...

    在ASP.NET中实现Url Rewriting (三)

    这篇文章主要探讨了如何在ASP.NET环境中使用HttpModule和HttpHandler来实现这一功能。 首先,理解网址重写的基本原理至关重要。URL重写是一种策略,它拦截HTTP请求的原始URL,并根据预定义的规则将其重定向到另一个...

    ASP.Net web server demo

    开发者可以通过查看源代码学习如何处理HTTP请求,创建自定义的HttpHandler或HttpModule,以及如何使用ASP.NET MVC或Web API框架来构建RESTful服务。 2. **Web版Client工程** 这个工程可能是一个基于浏览器的应用,...

Global site tag (gtag.js) - Google Analytics