首先第一次运行一个应用程序(WebSite或者WebApplication都是Web应用程序)
第一次请求 ->

1,IIS ->

2,aspnet_isapi(非托管dll) ->

3,HttpRuntime(到这里已经是托管的了)HttpRuntime中只有一个方法ProcessRequest 这个方法是整个应用程序的入口点 HttpContext就是在这个方法里面构建的 出了这个方法后HttpContext就构建完成了 ->

4,执行HttpApplication类的Start方法(因为是第一次请求,HttpApplication还没有建立即应用程序池中还没有该站点的HttpApplication对象存在,再第二次请求的时候应用程序池中就已经有HttpApplicationd对象了就不会执行这个方法了 只有应用程序池里没有该站点的HttpApplication对象的时候才会执行这个方法) ->

5,初始化各个HttpModule在HttpModule的Init方法中注册HttpApplication的事件方法 而Init中的HttpApplication就是那个新建立的或者从HttpApplication池中得到的那个->

6,按照顺序执行HttpModule们注册给HttpApplication的事件方法 ->

7,首先是Application的BeginRequest事件方法 这个事件的方法列表中的方法分散在任何地方 在HttpModule里有该事件的方法 所以后续的执行回反复进入HttpModule中去执行这些注册给HttpApplication事件的方法 其中HttpApplicaiton的事件方法在HttpApplication自己里面是按照约定的方法注册的 这里是约定的编程方式必须加上"HttpApplicaiton_"前缀 在HttpApplication_Start后的某个时候使用反射注册这些约定命名的方法到对应的HttpApplication的事件列表方法 ->

8,接着按照HttpApplication中事件的顺序执行注册给HttpApplication余下事件的事件方法 在HttpApplication执行到中间的某个环节的时候开启执行HttpHandler HttpHandler执行完了 Application的最后的事件是EndRequest 执行HttpApplication的EndRequest事件方法列表中的方法 这些方法有的在HttpModule中所以最后又进入HttpModule HttpModule的Init方法是给HttpApplication注册事件方法的唯一地方 最后看注册给HttpApplication的事件方法列表总方法都是分别在哪里 由HttpApplication的事件执行顺序决定整个管道中的流程 HttpModule的Init方法是唯一一个可以访问HttpApplication对象的地方 HttpModule在Init里给这个HttpApplication对象注册事件把HttpModule的自己的方法作为HttpApplication的事件方法横插在HttpApplication的事件流程中

HttpApplication的各个事件执行顺序就是所谓的管道 当一个请求进来的时候 IIS根据请求的Url把请求交给相应的站点 如果该站点是ASP.NET支持的话 HttpRuntime从HttpApplication应用程序池中取出一个HttpApplication对象 然后把这个取出来的HttpApplication对象交给HttpModule的Init(HttpApplication application)方法 HttpModule再给这个HttpApplication的“事件”插入“事件方法” 在HttpApplication中间会通过HttpHandlerFactory根据请求的Url的文件名以及扩展名决定经过哪一个HttpHandler 因为HttpHandler不是每一个都要经过的而是取决于Url的文件名和扩展名所以HttpHandler必不能保有对HttpApplication以及HttpModule这些对于每个请求都会经过的对象 否则的话HttpHandler就可以编程HttpApplication了 而这个HttpApplication会被放回HttpApplication应用程序池 就是网站应用程序池 也就是IIS上建立的那个池 那个池中存的就是该站点的HttpApplication对象
注意:HttpApplication被放入IIS的ASP.NET Web应用程序对象池的事件是在所有的HttpModule的Init方法被执行之后 第二次请求的时候是不会再经过HttpModule了 但是因为有的HttpModule在Init中把自己的方法注册给了HttpApplication的事件 所以后面才会反复进入HttpModule去执行HttpApplication的事件方法 如果HttpModule的Init方法不是把自己的方法注册给HttpApplication而是这个方法在其他地方那就不会再进入HttpModule了 也就是HttpModule里只有一个方法Init这个方法跟HttpApplication的Start方法一样是只会被执行一次的

ASP.NET执行循序的更多相关文章

  1. spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序)

    转载:spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序) 众所周知,spring声明式事务是基于AOP实现的,那么,如果我们在同一个方法自定义多个AOP,我们如何指定他们的执 ...

  2. 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)

    前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...

  3. join控制线程的执行循序 T1 -> T2 -> T3

    /** * 控制线程的执行循序 T1 -> T2 -> T3 * join实现 */ public static void join(){ Thread t1 = new Thread(( ...

  4. sql执行循序

    (8) select (9) distinct (11) top 1 (6) Table1.id,COUNT(Table1.name) as nameCount (1) from Table1 (3) ...

  5. yield和send的执行循序彻底搞清

    yield: 对于yield方法和Generator的send同时使用时的执行顺序一直搞不清,今天看到这篇 理解PHP中的Generator 加上测试,终于搞清了. 总结一下上文中的结论: Gener ...

  6. for循环的执行循序

    先上一段代码,大家说出此方法的执行结果: public class Print{ static boolean out(char c){ System.out.println(c); return t ...

  7. for循环中的条件执行循序

    问题: public class Main { public static void main(String[] args) { int i,n,length = 0; for(i=1;length& ...

  8. java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

    java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_Stat ...

  9. asp.net执行SqlServer存储过程!(详解!)

    ASP.NET执行存储过程 一. 执行一个没有参数的存储过程的代码如下: connectionString为连接字符串 SqlConnection conn=new SqlConnection(con ...

随机推荐

  1. FreeSwitch安装和配置记录

    安装FreeSwitch 主要示例,下面的命令: git clone -b v1.2.stable git://git.freeswitch.org/freeswitch.git cd freeswi ...

  2. C++不支持Unicode,即使utf8

    今天,字符串unicode我们已经不需要常理的理由,但是,一些有编程语言的悠久历史.这仍然是一个头疼. 尽管第三方库支持的假设,C++事实上没有真正有效地支持unicode.即使utf8.(注意:本文 ...

  3. Windows 8.1下 MySQL绿色版安装配置与使用

    原文:Windows 8.1下 MySQL绿色版安装配置与使用 Mysql-5.6.17-winx64操作步骤: 一.安装MySQL数据库 1.下载. 下载地址:http://downloads.my ...

  4. POJ 3589 Number-guessing Game(简单题)

    [题目简述]:两个四位数,假设后一个数中的某个数与前一个相应的数的位置和值都相等.则统计数目由几个这种数.记为count1吧. 假设后一个数中的某个数与前一个数的数值相等,但位置不同. 此时这种数的个 ...

  5. R 语言开发环境搭建

    R 语言在统计计算和画图方面有着显著的优势,因此在大数据领域也有其一席之地. 本文将演示怎样搭建R 语言开发环境. 搭建R 语言开发环境,主要有两个步骤: - 安装 R 到操作系统 - 安装支持 R ...

  6. C#的百度地图开发(一)发起HTTP请求

    原文:C#的百度地图开发(一)发起HTTP请求 百度地图的开发文档中给出了很多的事例,而当用到具体的语言来开发时,又会有些差异.我是使用C#来开发的.在获取相应的数据时,需要通过URL传值,然后获取相 ...

  7. Python的TkinterButton做为父窗口

    #-*-coding:utf--*- import Tkinter,time,tkMessageBox,sys,BeBigModule class MainFrame: def __init__(se ...

  8. SVNKIT的SVNCommitClient的doMkDir的操作

    package com.repositoryclient.svnoptions; import java.io.File; import org.tmatesoft.svn.core.SVNCommi ...

  9. HDU 4454 - Stealing a Cake(三分)

    我比较快速的想到了三分,但是我是从0到2*pi区间进行三分,并且漏了一种点到边距离的情况,一直WA了好几次 后来画了下图才发现,0到2*pi区间内是有两个极值的,每个半圆存在一个极值 以下是代码 #i ...

  10. AJAX基础知识点学�

    1.AJAX(Asynchronous JavaScript and XML)即,异步JavaScript和XML 2.同步/异步差别 同步: ①每次进行整个页面的刷新 ②同步的链接在同一时间仅仅能有 ...