`
wzhelp
  • 浏览: 47500 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

HTTPModules与HTTPHandler

    博客分类:
  • Net
阅读更多

HTTPModules与HTTPHandler

HTTPModules与HTTPHandler

一 asp.net请求的处理过程
-------------------
HttpModule  必须要掌握的东西
HttpHandler 必须要掌握的东西,非常有用
以上两个的实例
---------------------
asp.net 事件模型机制

-----------------------

客户的请求页面由aspnet_isapi.dll这个动态连接库来处理,把请求的aspx文件发送给CLR进行编译执行,然后把Html流返回给浏览器
--------------------------
二 页面事件
执行顺序
Page_Init:初始化值或连接
Page_Load:主要使用IsPostBack,该事件主要执行一系列得操作来首次创建asp.net页面或响应
由投递引起得客户端事件。在此事件之前,已还原页面和控件视图状态。
Page_DataBind:在页面级别上调用,也可在单个控件中调用。
DataBind_PreRender:数据绑定预呈现,恰好在保存视图状态和呈现控件之前激发此事件。
Page_Unload:此事件是执行最终清理工作的。
非确定事件
Page_Error:如果在页面处理过程中出现未处理的例外,则激发error事件。
Page_AbortTransaction:交易事件,事务处理中如果已终止交易,则激发此事件,购物车常用。
Page_CommitTransaction:如果已成功交易,则激发此事件。
--------------------------------------------------------
Global.asax中的事件(执行顺序)
Application_Start:应用程序启动时激发
Application_BeginRquest:http请求开始时激发
Application_AuthenticateRequest:  应用程序批准http请求时激发
Session_Start: 会话启动时激发
Application_EndRequest:Htttp请求结束时激发
Session_End:会话结束时激发
Application_End:应用程序结束时激发
Application_Error: 发生错误时激发
----------------------
ISAPI: 向web服务器插入某些组建,扩展功能,增强web服务器功能。
ISAPI: 扩展,win32的动态链接库,譬如aspnet_isapi.dll,可以把ISAPI扩展看作是一个普通的应用程序,它处理的目标是HTTP请求。
ISAPI: 过滤器,web服务器把请求传递给相关的过滤器,接下来过滤器可能修改请求,执行某些操作等等。
ASP.NET请求的处理过程:
基于管道模型,在模型中ASP.NET把http请求传递给管道中所有的模块。每个模块都接收HTTP请求,并有完全的控制权。一旦请求经过了所有的 HTTP模块,最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过模块管道中的HTTP模块。
-----------
httpmodule
ISAPI 过滤器(筛选器):IIS本身是不支持动态页面的,也就是说他仅仅支持静态HTML页面的内容,对于.asp .aspx .cgi .php等,IIS并不知道如果处理这些后缀标记,它就会把它当作文本,丝毫不做处理发送到客户端。为了解决这个问题,IIS有一种机制,叫做ISAPI 的过滤器。它是一个COM组件。
ASP.NET服务在注册到IIS的时候,会把每个扩展可以处理的文件扩展名注册到IIS里面(如*.ascx *.aspx等)。扩展启动后,就根据定义好的方式来处理IIS所不能处理的文件,然后把控制权跳转到专门处理代码的进程中,asp.net中是 aspnet_isapi.dll。让这个进程开始处理代码,生成标准的HTML代码,生成后把这些代码加入到原有的HTML中,最后把完整的HTML返回给IIS,IIS再把内容发送到客户端。
----------------
HttpModule
Http模块实现了过滤器 (ISAPI filter)的功能,它是实现了System.Web.IHttpModule接口的.net组件。。这些组件通过在某些事件中注册自身,把自己插入到 ASP.NET请求处理管道。当这些事件发生的时候,ASP.NET调用对请求有兴趣的HTTP模块,这样该模块就能处理请求了。有时候需要过虑一下 http请求,注意它不是覆盖其他的包括系统自带的HttpModule,在Machine.config中配置完成。
--------------------------------------
HttpHandler
它实现了ISAPI Extention的功能,它处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的通过必须实现 IHttpHandler接口。HTTP处理程序是实现System.Web.IHttpHandler接口的.NET组件。任何实现了该接口的类都可以用于处理输入的Http请求。它就是Http处理程序。



在以前的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("
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容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。
http://my.oschina.net/dxf/blog/271
分享到:
评论

相关推荐

    HttpModule和httpHandler学习例子

    1. **注册HttpModule**:在`Web.config`文件中,我们需要在`system.web/httpModules`节中添加模块的配置,指定它的类型全名。 2. **事件处理**:HttpModule通过实现`IHttpModule`接口,并覆盖`Init`和`Dispose`方法...

    HttpModule与HttpHandler

    HttpModule在请求生命周期的开始阶段介入,可以处理整个请求,而HttpHandler则在生命周期的末端介入,仅处理特定的请求内容。此外,HttpModule可以注册多个,而HttpHandler通常是为每个类型的请求指定一个。 在实际...

    httpmodule和httphandler

    - `HttpHandler`是用来处理特定HTTP请求的组件,通常与特定的URL模式相匹配。 - `HttpHandler`通过实现`IHttpHandler`接口来定义。 **2. 作用:** - **文件扩展名映射:** 处理特定类型的文件,如`.ashx`、`.asmx`...

    HttpModule HttpHandler HttpHandlerFactory

    HttpHandlerFactory则是用于创建和管理HttpHandler的工厂类。这三个概念是理解ASP.NET工作原理的关键。 **HttpModule:** HTTP模块是ASP.NET中的一个中间件组件,它在每个HTTP请求开始时被调用,并在请求结束时释放...

    详解在ASP.NET Core中如何编写合格的中间件

    当然MVC管道本身就是中间件,早在WebForm时代就出现过HttpModules、HttpHandler、那个时候悠然记得我通过它们来组织我的广告系统,不闲扯我们继续。 每个中间件组件都有一个带有HttpContext参数的Invoke方法。您可以...

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

    ASP.NET引擎与IIS有很多共同之处,它同样会在处理请求的过程中触发事件,并允许HttpModules处理这些事件,就像ISAPI过滤器在IIS中的工作方式。HttpModules是.NET框架中的组件,它们可以注册并响应HTTP管道中的特定...

    ASP.NET体系结构

    HttpModules是可插入的组件,可以在请求到达HttpHandler之前执行自定义逻辑,比如身份验证、状态管理、URL重写等。 13. HttpHandlers HttpHandlers是ASP.NET中的终结点,它们专门处理特定类型的HTTP请求,如静态...

    asp.net运行机制.doc

    而后续的POST请求,由于已存在会话,可以直接与已创建的对象交互,跳过部分初始化步骤,提高了性能。 当HTTP请求涉及缓存(ASP Cache)时,如果数据存在于缓存中,HttpHandler会直接从缓存获取,避免了重新计算或从...

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

    当请求到达时,根据URL映射规则,请求会被转发给合适的HttpHandler进行处理。HttpHandlers可以处理静态内容、动态内容以及其他自定义内容。 #### 十四、是否已经提供了足够的底层知识? 通过以上介绍,我们已经...

    asp.net中实现类似AOP功能

    与 `HttpHandler` 类似,`HttpModule` 实现了类似于 ISAPI Filter 的功能。它可以监听整个 HTTP 请求周期中的特定事件,如请求开始 (`BeginRequest`) 或请求结束 (`EndRequest`)。这意味着可以在请求的不同阶段执行...

    ASP生命周期

    5. **HttpModule与HttpHandler阶段** - **HttpModule**:HttpModule提供了事件处理机制,可以在ASP.NET请求的不同阶段执行代码。这些模块可以修改请求状态或响应内容,例如添加日志记录、安全验证等。 - **...

    .net伪静态示例

    实际上,更复杂的伪静态实现可能涉及到URL重写规则、路由规则以及与数据库的交互,以实现动态生成静态内容并缓存。这个简单的示例只是一个起点,实际项目中可能需要根据需求进行扩展和优化。记住,伪静态的关键在于...

    ajaxpro2

    配置可能包括将AjaxPro添加到系统.web/httpModules部分,以及在system.webServer/handlers或system.web/httpHandlers(取决于.NET Framework版本)部分中注册AjaxPro的处理程序。此外,还可以在web.config中配置服务...

    HttpModule介绍

    需要注意的是,`HttpModule`并不像`HttpHandler`那样可以指定处理特定路径或文件类型的请求,而是对所有进入ASP.NET的请求都有效。 #### HttpModule与Global.asax文件的关系 `HttpModule`通常会在`Global.asax`...

    如何在ASP.NET Core中给上传图片功能添加水印实例代码

    在传统的.NET Framework中,我们可以利用HttpModules或HttpHandler来处理,但.NET Core不再支持`WebImage`类,因此我们需要采用不同的方式来实现这一功能。 在.NET Core中,上传文件通常是通过`IFormFile`接口完成...

    ASP.NET程序设计基础教程课后习题答案

    在这个过程中,还有一些中间件(HttpModules)对请求进行预处理,这些处理可能涉及权限验证、日志记录等。最终,处理后的结果被返回给用户。 ##### 1.7.2 思考题 **1. 什么是WYSIWYG,在Windows操作系统中的什么字体...

    在ASP.NET中进行消息处理(一)

    - **HttpHandler**:处理器负责处理特定类型的HTTP请求。例如,ASPX页面处理程序处理.aspx文件的请求。 3. **IIS与ASP.NET集成** - **ISAPI扩展**:早期版本的ASP.NET使用ISAPI扩展与IIS交互,但现代版本使用更...

Global site tag (gtag.js) - Google Analytics