【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.asax的HttpApplication对象。在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.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:

A low-level Look at the ASP.NET Architecture

ASP.NET Process Model

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

精简概括:

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