首页 新闻 会员 周边

Asp.NET 应用程序生命周期中的 HttpApplication 怎么理解?

0
悬赏园豆:20 [已解决问题] 解决于 2010-08-25 18:52

HttpApplication 不是代表 应用程序吗?

为什么 每个请求发送过来后 需要 重新 实例化呢?

还有就是 什么时候 实例化 \什么时候 又会重用这个对象

Tell_How的主页 Tell_How | 初学一级 | 园豆:180
提问于:2010-08-21 00:14
< >
分享
最佳答案
0

一个 应用程序都属于应用程序池,对于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

收获园豆:20
HUHU慈悲 | 大侠五级 |园豆:9973 | 2010-08-21 01:40
其他回答(3)
0

给篇文章看看,底层很重要,要经常复习。

http://www.cnblogs.com/yjmyzz/archive/2010/03/28/1698968.html

Astar | 园豆:40805 (高人七级) | 2010-08-21 08:47
0

一定要分清楚应用程序和应用程序域,后者会告诉你如何在程序运行时更新应用程序集。

Launcher | 园豆:45045 (高人七级) | 2010-08-21 18:06
0

因为每个请求都要经过一系列的处理,经过一系列的HttpModule和一个HttpHandler,这些处理是用事件来激发的,这需要实例化HttpApplication对象来激发事件。

灰灰狼 | 园豆:5 (初学一级) | 2010-08-22 06:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册