【ASP.NET Process Model 笔记 二】ASP.NET Http Runtime Pipeline

  •  HttpApplication本身并不提供对Request的处理功能,而是通过在不同阶段出发不同的Event。之所以HttpApplication会有一些处理是因为系统本身有些module和handler定制了HttpApplication的事件。
  •  就像其名称体现的一样,HttpApplication基本上可以看成是真个ASP.NET Application的体现。HttpApplication和置于虚拟根目录的Gloabal.asax对应。通过HttpApplicationFactory.GetApplicationInstance创建一个基于Gloabal.asaxHttpApplication对象。在HttpApplicationFactory.GetApplicationInstance方法返回创建的HttpApplication对象之前,会调用一个名为InitInternal的内部方法,该方法会做一些列的初始化的操作,在这些初始化操作中,最典型的一个初始化方法为InitModules(),该方法的主要的目的就是查看Config中注册的所有HttpModule,并根据配置信息加载相应的Assembly,通过Reflection创建对应的HttpModule,并将这些Module加到HttpApplication _moduleCollection 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.NETHttpApplication的使用采用Pool的机制:当Request到达,ASP.NET会现在HttpApplication Pool中查找未被使用的HttpApplication对象,如果没有,则创建之,否则从Pool直接提取。
  •  一般情况一下,一个Application对应一个App Domain,但有一种特殊的场景:在当前Application正在处理Request的时候,我们把web.config以及其他一些相关文件修改了,而且这种改变是可以马上被ASP.NET检测到的,为了使我们的变动能够及时生效,对于改动后的第一个RequestASP.NET会为期创建一个新的AppDomain,而对于原来的AppDomain,也许还在处理修改前的Request,所有原来的Appdomain会持续到将原来的Request处理结束之后,所以对于一个Application,可能出现多个AppDomain并存的现象。
     

 

参考资料:

[原创]ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II  

 

精简概括: 

ASP.Net处理HTTP请求的内部流程

posted @ 2012-01-04 11:13  苏先森1989  阅读(321)  评论(0编辑  收藏  举报