HttpApplication 对象的创建过程及HttpModule过滤器的内部实现过程
2013-09-22 01:36
417 查看
最近通过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 = this._moduleCollection.Count;
for (int i = 0; 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 对象的创建过程
从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 = this._moduleCollection.Count;
for (int i = 0; i < count; i++) {
this._currentModuleCollectionKey = this._moduleCollection.GetKey(i);
this._moduleCollection[i].Init(this);
}
那什么时候执行过滤中的方法呢?
回到前面,此时HttpApplication对象已经创建完成,并且在 HttpApplicationFactory.GetApplicationInstance(context);方法内部已经创建好了httpmodules对象的集合,也注册了相应的处理事件的方法。接下来在调用applicationInstance.ProcessRequest(context);处理方法时,当它处理管道中事件,将会调用相应的httpmodule中的方法,因为她们在创建HttpApplication对象实例的时候已经注册好了。
不知道总结的对不对,希望有高人指正。
相关文章推荐
- Java乔晓松-ajax的概述和XMLHTTPRequest对象的创建过程
- ajax的概述和XMLHTTPRequest对象的创建过程
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
- Asp.Net运行时对象生成过程以及HttpHandler和HttpModule的处理过程。
- HttpApplication处理对象与HttpModule处理模块
- ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤
- HttpApplication处理对象与HttpModule处理模块 (第三篇)
- [读书笔记]组件设计:补白[深入剖析ASP.NET组件设计]一书中HttpApplication对象创建的细节
- Spring3.1.0实现原理分析(九).AOP之创建代理对象的过程
- 跨浏览器 创建xmlhttprequest 对象 以及和服务器交互的全过程
- HttpApplication对象创建的细节
- 组件设计:补白[深入剖析ASP.NET组件设计]一书中HttpApplication对象创建的细节
- HttpApplication处理对象与HttpModule处理模块 (第三篇)
- [深入剖析ASP.NET组件设计]一书中HttpApplication对象创建的细节(转)
- HttpApplication处理对象与HttpModule处理模块
- 21.手动创建Application,实现对某一对象的单例模式化,以及全局的context的设置
- 创建Opener对象以实现Cookie与其它HTTP功能
- .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器
- HttpApplication处理对象与HttpModule处理模块 (第三篇)
- 用创建XMLHttpRequest对象与jQuery框架对文本为HTTP、JSON、XML的ajax实现比较