最近通过Reflector学习了一下asp.net内部的原理,做做笔记,方便以后查阅。

先看下HttpApplication 对象的创建过程

IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);这里看出,HttpApplication 实例 是通过HttpApplicationFactory创建出来的,但它内部又是怎样操作的呢?

1、在theApplicationFactory.EnsureInited();方法中确定创建的HttpApplication类的类型,首先从网站中获取global.asax文件,该文件继承自HttpApplication类,如果网站中没有添加该文件,则返回它本身(也是父类)的HttpApplication类类型,如果存在global.asax文件,则返回子类类型的HttpApplication;

2、在 _theApplicationFactory.EnsureAppStartCalled(context);方法中确保global.asax中的start方法被调用,该方法只在网站第一被访问时执行,也就是每一个浏览器第一次访问网站是执行该方法,只执行一次,浏览过程中不会再执行。

3、在theApplicationFactory.GetNormalApplicationInstance(context);方法内通过对象池(将HttpApplication对象插入到一个栈的数据结构中)的技术创建一个HttpApplication实例,如果池内没有现成的实例对象,则通过反射将1中的HttpApplication类的类型传入CreateNonPublicInstance(type, null);方法中,然后创建出一个HttpApplication实例。

至此HttpApplication实例已创建完成。

接着调用application.InitInternal(context, this._state, this._eventHandlerMethods);方法创建出过滤的对象,其中context是一个httpcontext对象:

    调用方法 this.InitModules();初始化HttpModule集合。内部又是怎么实现的呢?

1、调用内部方法:this._moduleCollection = RuntimeConfig.GetAppConfig().HttpModules.CreateModules();通过读取网站的配置文件 this._modualEntry = new ModulesEntry(this.Name, this.Type, _propType.Name, this);将modules中所有节点中对应的类型加入到集合中

HttpModuleCollection modules = new HttpModuleCollection();
    foreach (HttpModuleAction action in this.Modules)
    {
        modules.AddModule(action.Entry.ModuleName, action.Entry.Create());
    }
    modules.AddModule("DefaultAuthentication", new DefaultAuthenticationModule());
    return modules;

然后返回modules

2、在 this.InitModulesCommon();方法中 遍历modules中的每一个对象,并调用它的Init方法,在方法中可以注册HttpApplication处理管道中的19个事件的任意方法。

int count = ; i < count; i++) {

this._currentModuleCollectionKey = this._moduleCollection.GetKey(i);
        this._moduleCollection[i].Init(this);
    }

那什么时候执行过滤中的方法呢?

回到前面,此时HttpApplication对象已经创建完成,并且在 HttpApplicationFactory.GetApplicationInstance(context);方法内部已经创建好了httpmodules对象的集合,也注册了相应的处理事件的方法。接下来在调用applicationInstance.ProcessRequest(context);处理方法时,当它处理管道中事件,将会调用相应的httpmodule中的方法,因为她们在创建HttpApplication对象实例的时候已经注册好了。

不知道总结的对不对,希望有高人指正。

HttpApplication 对象的创建过程及HttpModule过滤器的内部实现过程的更多相关文章

  1. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  2. JVM中对象的创建过程

    JVM中对象的创建过程如以下流程图中所示: 对其主要步骤进行详细阐述: 为新生对象分配内存: 内存的分配方式: 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存放在一边,空闲的内存在另一边, ...

  3. Emit学习(2) - IL - 对象的创建过程

    上一篇的介绍中, 并没有介绍到对象的创建过程, 这一篇主要就介绍一下, 对象的创建过程. 其实熟悉了IL语法之后, 完全可以用Reflector反编译代码去查看. 而且正因为有这个工具, 可以对照着R ...

  4. java --- 对象的创建过程

    java 对象创建的过程 存在了继承关系之后,对象创建过程如下: 1.分配空间.要注意的是,分配空间不光是分配子类的空间,子类对象中包含的父类对象所需要的空间,一样在这一步统一分配.在分配的空间的时候 ...

  5. 对象的创建过程(chapter5.7.3)

    总结一下对象的创建过程,假设有一个名为Dog的类: 1. 即使没有显示地使用static关键字,构造器实际上也是静态的方法,因此,当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类 ...

  6. 2 Java对象的创建过程

    JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢? 程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢? 一 对象创建的步骤 1 遇到new指令时,检查这个指令的参数是 ...

  7. [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示

    javascript面向对象编程方式,对于初学者来说,会比较难懂. 要学会面向对象以及使用面向对象编程,理解对象的创建在内存中的表示,至关重要. 首先,我们来一段简单的对象创建代码 var obj = ...

  8. 类和对象的创建过程(元类,__new__,__init__,__call__)

    一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() pri ...

  9. java中类的加载过程和对象的创建过程

    1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...

随机推荐

  1. 变量动态选取资源ID

    1.使用Resources 类的 getIdentifier方法  Resources res=getResources();        return res.getIdentifier(type ...

  2. LeetCode:柠檬水找零【860】

    LeetCode:柠檬水找零[860] 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向 ...

  3. Python 可变长度函数参数

    func( *tuple_grp_nonkw_args, **dict_grp_kw_args ) 在编程的过程中,我们可能会遇到函数参数个数不固定的情况.这时就需要使用可变长度的函数参数来实现我们的 ...

  4. 每天一个Linux命令(35)wc命令

          Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出.       (1)用法:     用法:  wc [选项] [文件]. ...

  5. 【二】MongoDB入门

    下面是mongodb的一些基本概念: 文档是MongoDB中数据的基本单元,类似关系数据库中的行. 集合,是存储文档的容器,类似关系数据库中的表. MongoDB的单个实例容纳多个数据库,每个数据库都 ...

  6. Python 3 udp 套接字

    Python 3 udp套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号, ...

  7. chattr与lsattr命令详解

    PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的li ...

  8. SrpingCloud 之SrpingCloud config分布式配置中心搭建

    1.搭建git环境   目的:持久化存储配置文件信息 采用码云 创建后 继续创建文件夹  用来区分不同的项目 下面就是git上存放配置文件了.环境的区分 dev  sit pre prd   开发  ...

  9. Android平台及其架构(部分转载)

    一.Android的系统架构 1.      应用程序 同Android系统一起发布的核心应用程序,如email 客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等. 这些应用程序都是用 ...

  10. EntityFramework 学习 一 DbSet

    DBSet类表示一个实体的集合,用来创建.更新.删除.查询操作,DBSet<TEntity>是DBSet的泛型版本 你可以使用DbContext获取DBSet的引用,例如dbContext ...