Asb*_*erg 7 asp.net lifecycle httpapplication app-startup
自从我几年前开始编写经典的ASP 12(左右)以来,我已经完成了这一切,我从来没有找到一个很好的解决方案,因为ASP和ASP.NET的架构一直是不良做法的沼泽,魔术共享单身,等我最大的问题是用HttpApplication其非事件的事件(对象Application_Start,Application_End等等).
如果你想在HTTP应用程序的整个生命周期内做一次Application_Start事情,那么这是显而易见的.对?不完全是.首先,这本身不是一个事件,它是一个神奇的命名约定,如果遵循这个约定,会导致该方法在IIS创建的每个AppDomain上调用一次.
除了魔术命名惯例是一种可怕的做法,我开始认为这可能是Start在HttpApplication对象上不存在事件的原因.所以我已经尝试过确实存在的事件,例如Init.嗯,这也不是一个真正的事件,它是一个可以覆盖的方法,这是下一个最好的事情.
似乎该Init()方法是针对HttpApplication对象的每个实例化调用的,每个AppDomain发生的次数不止一次.这意味着我不妨将我的启动逻辑放在HttpApplication对象的构造函数中.
现在我的问题是,为什么我不应该将我的启动逻辑放在构造函数中?为什么甚至Init()存在,我需要关心什么Application_Start?如果我这样做,任何人都可以解释为什么HttpApplication对象中的这个伪事件没有适当的事件或可覆盖的方法?
任何人都可以向我解释为什么在一个典型的ASP.NET应用程序中,我HttpApplication创建了8个实例(这会导致构造函数Init运行多次,当然;这可以通过锁定和调用的共享静态布尔值来缓解initialized)当我的应用程序只有一个AppDomain?
Asp.Net 运行时保留一个 HttpApplication 对象池。每个 .aspx 请求都由从池中分配的单个对象(在您的情况下为 8 个对象)处理。
您的问题的答案,Application_Start 事件确实被调用,但仅针对 HttpApplication 的第一个实例,而不是后续实例,因此您可以确保每当您的应用程序启动或 IIS 的应用程序池重新启动时,它都会被调用一次。Application_OnEnd 事件也是如此(最后一个实例)
同时,在 HttpApplication 对象的每个实例上都会调用 Init() 和 Dispose()。这将在每个实例(也称为每个请求)上调用。
他们为什么要这样做..?也许是为了平衡性能和内存优化。
希望我回答了你的问题。
小智 3
第一次创建 HttpApplication 实例时调用 Application_Start,但在后续实例中不调用 Application_Start 似乎有点麻烦。也许微软不想向那些并不真正想了解的人解释静态构造函数的概念。
然而,Application_End() 似乎是必需的,因为 C# 中没有静态析构函数/终结器的等效项。就黑客而言,这并没有那么糟糕。只是闻起来有点好笑。
| 归档时间: |
|
| 查看次数: |
2216 次 |
| 最近记录: |