- HttpApplication本身并不提供对Request的处理功能,而是通过在不同阶段出发不同的Event。之所以HttpApplication会有一些处理是因为系统本身有些module和handler定制了HttpApplication的事件。
- 就像其名称体现的一样,HttpApplication基本上可以看成是真个ASP.NET Application的体现。HttpApplication和置于虚拟根目录的Gloabal.asax对应。通过.创建一个基于Gloabal.asax的HttpApplication对象。在.方法返回创建的HttpApplication对象之前,会调用一个名为的内部方法,该方法会做一些列的初始化的操作,在这些初始化操作中,最典型的一个初始化方法为(),该方法的主要的目的就是查看Config中注册的所有HttpModule,并根据配置信息加载相应的Assembly,通过Reflection创建对应的HttpModule,并将这些Module加到HttpApplication 的_ Filed中。HttpApplicationFactory.GetApplicationInstance()反编译如下:
internal static IHttpHandler GetApplicationInstance(HttpContext context)
{ if (_customApplication != null) { return _customApplication; } if (context.Request.IsDebuggingRequest) { return new HttpDebugHandler(); } _theApplicationFactory.EnsureInited(); _theApplicationFactory.EnsureAppStartCalled(context); return _theApplicationFactory.GetNormalApplicationInstance(context); } - 一个Application会有一个HttpApplication Pool,ASP.NET对HttpApplication的使用采用Pool的机制:当Request到达,ASP.NET会现在HttpApplication Pool中查找未被使用的HttpApplication对象,如果没有,则创建之,否则从Pool直接提取。
- 一般情况一下,一个Application对应一个App Domain,但有一种特殊的场景:在当前Application正在处理Request的时候,我们把web.config以及其他一些相关文件修改了,而且这种改变是可以马上被ASP.NET检测到的,为了使我们的变动能够及时生效,对于改动后的第一个Request,ASP.NET会为期创建一个新的AppDomain,而对于原来的AppDomain,也许还在处理修改前的Request,所有原来的Appdomain会持续到将原来的Request处理结束之后,所以对于一个Application,可能出现多个AppDomain并存的现象。
参考资料:
Reference:
ASP.NET Process Model
ASP.NET Process Model
精简概括: