HttpApplication 对象的创建过程及HttpModule过滤器的内部实现过程
最近通过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过滤器的内部实现过程的更多相关文章
- 图解JAVA对象的创建过程
前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...
- JVM中对象的创建过程
JVM中对象的创建过程如以下流程图中所示: 对其主要步骤进行详细阐述: 为新生对象分配内存: 内存的分配方式: 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存放在一边,空闲的内存在另一边, ...
- Emit学习(2) - IL - 对象的创建过程
上一篇的介绍中, 并没有介绍到对象的创建过程, 这一篇主要就介绍一下, 对象的创建过程. 其实熟悉了IL语法之后, 完全可以用Reflector反编译代码去查看. 而且正因为有这个工具, 可以对照着R ...
- java --- 对象的创建过程
java 对象创建的过程 存在了继承关系之后,对象创建过程如下: 1.分配空间.要注意的是,分配空间不光是分配子类的空间,子类对象中包含的父类对象所需要的空间,一样在这一步统一分配.在分配的空间的时候 ...
- 对象的创建过程(chapter5.7.3)
总结一下对象的创建过程,假设有一个名为Dog的类: 1. 即使没有显示地使用static关键字,构造器实际上也是静态的方法,因此,当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类 ...
- 2 Java对象的创建过程
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢? 程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢? 一 对象创建的步骤 1 遇到new指令时,检查这个指令的参数是 ...
- [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
javascript面向对象编程方式,对于初学者来说,会比较难懂. 要学会面向对象以及使用面向对象编程,理解对象的创建在内存中的表示,至关重要. 首先,我们来一段简单的对象创建代码 var obj = ...
- 类和对象的创建过程(元类,__new__,__init__,__call__)
一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() pri ...
- java中类的加载过程和对象的创建过程
1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...
随机推荐
- SUBMIT 用法
[转自http://lz357502668.blog.163.com/blog/static/16496743201241195817597/] 1.最普通的用法 *Code used to exec ...
- 牛客练习赛13 B 幸运数字Ⅱ 【暴力】【二分】
题目链接 https://www.nowcoder.com/acm/contest/70/B 思路 没有代码限制 先打表 打出 幸运数字的表 然后 二分查找 第一个 大于 r 的幸运数字 然后 往 L ...
- Sql Server2008——存储过程编程简单例子
主要介绍: 存储过程的定义方法及其使用方法. 实例介绍: 1 创建学生表Student create database Stu use Stu go CREATE TABLE Student ( Sn ...
- python 3 递归调用与二分法
递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...
- 仿新浪游戏频道js多栏目全屏下拉菜单导航条
仿新浪游戏频道js多栏目全屏下拉菜单导航条,新浪,游戏频道,js组件,多栏目,全屏下拉,下拉菜单,导航条.代码下载地址:http://www.huiyi8.com/sc/26765.html更多请访问 ...
- 利用Hibernate 框架,实现对数据库的增删改查
增: package com.maya.test; import org.hibernate.*; import org.hibernate.cfg.*; import com.maya.model. ...
- linux-常用指令1
掌握下面的命令是最基本的噢!那是我们使用一个系统最基本的操作. 玩过dos么,其实,linux下的文件操作和dos差不多.没什么难的,多练习就记住了.下面如果有条件的话请跟我一样操作吧!百看不如一做. ...
- hibernate复习第(一)天
首先导入jar. 这个版本是3.2.5 开发流程: 1.由Domain object ->mapping ->db (官方推荐) 2.由DB开始,使用工具生成mapping和Domain ...
- myeclipes如何调试web项目
你可以右击项目,然后选中那个debug as,然后选择open debug dialog,在project中选择要运行的项目,sever中选择服务器,然后单击debug就ok了,,
- linux命令学习笔记(61):tree 命令
shendu@shenlan:~$ tree 程序“tree”尚未安装. 您可以使用以下命令安装: sudo apt-get install tree shendu@shenlan:~$ sudo a ...