ASP.NET的必须知道的东东(HttpModule,HttpHandler)

2023-05-16

asp.net架构

一 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掉这个映射关系。

view plain copy to clipboard print ?
  1. public class HelloWorldModule : IHttpModule  
  2.   
  3. {  
  4.   
  5.     public HelloWorldModule()  
  6.   
  7.     {  
  8.   
  9.     }  
  10.   
  11.   
  12.   
  13.     public String ModuleName  
  14.   
  15.     {  
  16.   
  17.         get { return "HelloWorldModule"; }  
  18.   
  19.     }  
  20.   
  21.   
  22.   
  23.     // In the Init function, register for HttpApplication   
  24.   
  25.     // events by adding your handlers.  
  26.   
  27.     public void Init(HttpApplication application)  
  28.   
  29.     {  
  30.   
  31.         application.BeginRequest +=   
  32.   
  33.             (new EventHandler(this.Application_BeginRequest));  
  34.   
  35.         application.EndRequest +=   
  36.   
  37.             (new EventHandler(this.Application_EndRequest));  
  38.   
  39.     }  
  40.   
  41.   
  42.   
  43.     private void Application_BeginRequest(Object source,   
  44.   
  45.          EventArgs e)  
  46.   
  47.     {  
  48.   
  49.     // Create HttpApplication and HttpContext objects to access  
  50.   
  51.     // request and response properties.  
  52.   
  53.         HttpApplication application = (HttpApplication)source;  
  54.   
  55.         HttpContext context = application.Context;  
  56.   
  57.         context.Response.Write("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");  
  58.   
  59.     }  
  60.   
  61.   
  62.   
  63.     private void Application_EndRequest(Object source, EventArgs e)  
  64.   
  65.     {  
  66.   
  67.         HttpApplication application = (HttpApplication)source;  
  68.   
  69.         HttpContext context = application.Context;  
  70.   
  71.         context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");  
  72.   
  73.     }  
  74.   
  75.   
  76.   
  77.     public void Dispose()  
  78.   
  79.     {  
  80.   
  81.     }  
  82.   
  83. }  
view plain copy to clipboard print ?
  1. <system.web>  
  2.   
  3.  <httpModules>  
  4.   
  5.   <add name="HelloWorldModule" type="HelloWorldModule"/>  
  6.   
  7.  </httpModules>  
  8.   
  9.    </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容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。

转载于:https://www.cnblogs.com/Tim_Liu/archive/2011/04/26/2029477.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET的必须知道的东东(HttpModule,HttpHandler) 的相关文章

随机推荐

  • gcc make 与cmake

    1 gcc xff08 1 xff09 是什么 xff1f 它是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器 它可以编译很多种编程语言 xff08 括C C
  • server unexpectedly closed network connection

    在使用 ssh 登入 Linux 時 xff0c 卻發生了 server unexpectedly closed network connection 的狀況 解决方法 xff1a 1 修改 etc ssh sshd config 將 Us
  • 开源SDN控制器和商用SDN控制器一览

    以下是来自IT168收集的2014年可追寻到的开源SDN控制器和商用SDN控制器 xff0c 此处转载以供大家知悉 xff0c 更多控制器信息需要大家自己动手去查询和理解 开源SDN控制器组织 随机排序 xff0c 仅为了查看便利 1 组织
  • openstack 异常处理

    1 xff0c keystone 验证失败 xff0c 例如 xff1a Authorization failed The request you have made requires authentication from 172 16
  • [原]C++头文件的包含顺序研究

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 一 xff0e Google C 43 43 编程风格指南 里的观点 公司在推行编码规范 xff0c 领导提议基本上使用 Google C
  • 使用badblocks检测坏块

    命令格式 badblocks svw b lt 区块大小 gt o lt 输出文件 gt 磁盘装置 磁盘区块数 启始区块 典型的命令如下 写测试 数据安全 sudo badblocks n b 4096 c 16 s dev sda o h
  • Soft NMS改进的非极大值抑制方法的pytorch cuda版本,可以用

    话不多说 xff0c 直接上代码 xff0c 代码是根据soft max论文提供的代码 xff0c 修改的 xff0c 原来的代码是cpu版本 xff0c 且返回的keep参数并不是原来bbox的序列参数 xff0c 所以做了部分修改 xf
  • redis session时,sessionId作为token,可靠实现

    场景 xff1a 在一些不能使用session xff0c 或者session不能保持的情况 xff0c 通常服务器端产生一个token字符串标识用户登录状态 当前端调用后端接口时 xff0c 将此token作为参数加入到请求中 xff0c
  • 好朋友简简单单,好情谊清清爽爽,好缘份久久长长

    好朋友简简单单 xff0c 好情谊清清爽爽 xff0c 好缘份久久长长 A good friend is simple a good friendship is refreshing a good relationship lasts fo
  • LwIP raw api下使用tcp keep alive

    First we should enable this macro in lwipopts h define LWIP TCP KEEPALIVE 1 The following code is implemented after tcp
  • 阿里云API网关(9)常见问题

    网关指南 xff1a https help aliyun com document detail 29487 html spm 61 5176 doc48835 6 550 23Oqbl 网关控制台 xff1a https apigatew
  • mysql实现随机获取几条数据的方法

    sql语句有几种写法 1 xff1a SELECT FROM tablename ORDER BY RAND LIMIT 想要获取的数据条数 xff1b 2 xff1a SELECT FROM 96 table 96 WHERE id gt
  • Spring5:@Autowired注解、@Resource注解和@Service注解

    什么是注解 传统的Spring做法是使用 xml文件来对bean进行注入或者是配置aop 事物 xff0c 这么做有两个缺点 xff1a 1 如果所有的内容都配置在 xml文件中 xff0c 那么 xml文件将会十分庞大 xff1b 如果按
  • zabbix之监控redis云服务

    参考文档 xff1a http www 21yunwei com archi redis云服务的监控难点为服务部署在云上 xff0c 无法对服务进行配置等相关配置 实现方式 xff1a 编写采集脚本 gt 通过zabbix agent连接到
  • 卡方检验的自由度

    为什么80 的码农都做不了架构师 xff1f gt gt gt 自由度 xff1a 取值不受限制的变量的个数 如何理解这句简单的话呢 xff1f 给定一组数据 xff0c 我们来计算不同的统计量 xff0c 看看自由度的变化 这些数据分别为
  • Microsoft.NETCore.App 版本不一致导致的运行失败

    为什么80 的码农都做不了架构师 xff1f gt gt gt 场景重现 今天新建了一个 ASP NET Core 的项目 通过 Web Deploy 顺利发布到IIS上后 但访问时出现如下异常 异常原因 通过手动执行dotnet命令发现运
  • 2007年最值得期待的40部北美大片(争取去电影院看50%)

    1 Spider Man 3 蜘蛛侠3 导 演 xff1a 萨姆 莱米 Sam Raimi 主 演 xff1a 托比 马圭尔 Tobey Maguire Thomas Haden Church 柯尔斯滕 邓斯特 Kirsten Dunst
  • UML实例(五):在线购物系统设计类图

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在线购物系统设计类图文档 xff1a 1 图形文档 设计类图 界面类图 2 文字说明 该部分由以下部分组成 xff1a 类图综述 类描述 类联描述 继承描述 依赖描述和其他
  • 为啥很多网站的用户端都更新了,博客园还是原来的样子呢

    重回博客园发布一些工作中的文章 xff0c 心得 xff0c 发现博客园在界面上还是跟7 8年前没啥区别 xff0c 界面经典好用 xff0c 这是不用质疑的 xff0c 但是发布内容的一些地方 xff0c 好像不像其他网站那么方便了 xf
  • ASP.NET的必须知道的东东(HttpModule,HttpHandler)

    asp net架构 一 asp net请求的处理过程 xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff0d xff