自从 12(大约)年前我开始编写经典 ASP 以来,我就一直在研究这个问题,但我从未找到一个很好的解决方案,因为 ASP 和 ASP.NET 的体系结构一直是不良实践的沼泽,魔法共享单例等。我最大的问题是HttpApplication http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx对象及其非事件事件 (Application_Start
, Application_End
, etc.).
如果您想在 HTTP 应用程序的整个生命周期中只执行一次操作,Application_Start
是显而易见的地方。正确的?不完全是。首先,这本身不是一个事件,它是一个神奇的命名约定,遵循该约定时,会导致 IIS 创建的每个 AppDomain 调用该方法一次。
除了神奇的命名约定是一种可怕的做法之外,我开始认为这可能是不存在这样的东西的原因Start
事件于HttpApplication
目的。所以我尝试了确实存在的事件,例如Init
。好吧,这也不是一个真正的事件,它是一个可重写的方法,这是下一个最好的事情。
看来Init()
方法的每个实例化都会被调用HttpApplication
对象,每个 AppDomain 都会发生多次。这意味着我不妨将启动逻辑放入HttpApplication
对象的构造函数。
现在我的问题是,为什么我不应该将启动逻辑放在构造函数中?为什么甚至Init()
存在并且我需要关心吗Application_Start
?如果我这样做,任何人都可以解释为什么在这个伪事件中没有正确的事件或可重写的方法HttpApplication
object?
谁能向我解释为什么在典型的 ASP.NET 应用程序中,我的 8 个实例HttpApplication
创建(这会导致构造函数和Init
当然,要跑同样多的次数;这可以通过锁定和共享静态布尔值来缓解initialized
)当我的应用程序只有一个 AppDomain 时?
Asp.Net 运行时保留一个 HttpApplication 对象池。每个 .aspx 请求都由从池中分配的单个对象(在您的情况下为 8 个对象)处理。
您问题的答案,Application_Start 事件确实被调用,但仅针对 HttpApplication 的第一个实例,而不是后续实例,因此您可以确保每当您的应用程序启动或 IIS 的应用程序池重新启动时,它都会被调用一次。 Application_OnEnd 事件也是如此(最后一个实例)
同时,在 HttpApplication 对象的每个实例上都会调用 Init() 和 Dispose()。这将在每个实例(也称为每个请求)上调用。
他们为什么要这样做..?也许是为了平衡性能和内存优化。
希望我回答了你的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)