一个 应用程序都属于应用程序池,对于ASP.NET 程序来说(.net4.0 以前的版本),一个应用程序池会运行一个 .net CLR ,当一个请求到达IIS 后,IIS检测谁能够来处理请求、当CLR 接受到一个请求后,会调用HttpApplicationFactory 来获取一个HttpApplication 对象,HttpApplicationFactory 本身维持着一个HttpApplication 对象池,所以会先检测池中有没有能够处理当前请求的HttpApplication对象,有则直接返回对象、否则则创建个新的对象;(对象池的大小由Machine.config 配置、默认是100,如果HttpApplication 对象的个数少于 100,如果当前对象池中的对象没有空闲对象来处理当前请求、HttpApplicationFactory 会创建新的对象来处理当前请求并将对象放入池中。如果对象池中对象个数大于、等于100,则会等待、直到有对象空闲下来、才分配当前请求给空闲的对象。)然后由 HttpApplication 对象来分发请求(分配给一个个httpHandler来处理请求),因为HttpApplication 对象会分发所有的请求,所以可以把HttpApplication 看成应用程序。每个HttpApplication 对象都会有个 Application 对象,Application 对象维护着整个应用程序的全局信息;Application 在整个应用程序域中都是 单例 的存在。在整个应用程序域存活期间、Application 对象始终存在,但在应用程序域销毁(IIS 重启、应用程序池卸载)就会丢失信息。所以IIS 重启、应用程序池卸载后,所有对象都得重新创建。
可以看看关于ASP.NET 底层的架构的分析:
http://blog.sina.com.cn/s/blog_56f9ca26010005h4.html
http://www.lw23.com/pdf_3149e1c8-e3c3-4bbb-8af8-5f9cfb9c2f58/lunwen.pdf
一定要分清楚应用程序和应用程序域,后者会告诉你如何在程序运行时更新应用程序集。
因为每个请求都要经过一系列的处理,经过一系列的HttpModule和一个HttpHandler,这些处理是用事件来激发的,这需要实例化HttpApplication对象来激发事件。