gpt4 book ai didi

asp.net - Application_Start 与 OnInit 与构造函数

转载 作者:行者123 更新时间:2023-12-02 17:11:45 25 4
gpt4 key购买 nike

自从 12(大约)年前开始编写经典 ASP 以来,我就一直在研究这个问题,但我从未找到一个很好的解决方案,因为 ASP 和 ASP.NET 的体系结构一直是不良实践的沼泽、神奇的共享单例等等。我最大的问题是 HttpApplication对象及其非事件事件(Application_StartApplication_End 等)。

如果您想在 HTTP 应用程序的整个生命周期中执行一次操作,Application_Start 显然是执行此操作的位置。正确的?不完全是。首先,这本身不是一个事件,它是一个神奇的命名约定,遵循该约定时,会导致 IIS 创建的每个 AppDomain 调用该方法一次。

除了神奇的命名约定是一种可怕的做法之外,我开始认为这可能是 HttpApplication 对象上不存在 Start 事件之类的原因。因此,我尝试了确实存在的事件,例如 Init。嗯,这也不是真正的事件,它是一个可重写的方法,这是下一个最好的事情。

似乎每次 HttpApplication 对象的实例化都会调用 Init() 方法,这种情况在每个 AppDomain 中会发生多次。这意味着我不妨将启动逻辑放入 HttpApplication 对象的构造函数中。

现在我的问题是,为什么我不应该将启动逻辑放在构造函数中?为什么Init()存在并且我需要关心Application_Start?如果我这样做,任何人都可以解释为什么 HttpApplication 对象中没有适当的事件或可重写的方法来处理此伪事件?

谁能向我解释为什么在典型的 ASP.NET 应用程序中,创建了 8 个 HttpApplication 实例(这导致构造函数和 Init 的运行方式与当然,很多时候;当我的应用程序只有一个 AppDomain 时,可以通过锁定和名为 initialized 的共享静态 bool 值来缓解这种情况?

最佳答案

Asp.Net 运行时保留一个 HttpApplication 对象池。每个 .aspx 请求都由从池中分配的单个对象处理(在您的情况下为 8 个对象)。

您的问题的答案,Application_Start 事件确实被调用,但仅针对 HttpApplication 的第一个实例,而不是后续实例,因此您可以确保每当您的应用程序启动或应用程序池的应用程序时,它都会被调用一次。 IIS 已重新启动。 Application_OnEnd 事件也是如此(最后一个实例)

同时,在 HttpApplication 对象的每个实例上都会调用 Init() 和 Dispose()。这将在每个实例(也称为每个请求)上调用。

他们为什么要这样做..?也许是为了平衡性能和内存优化。

希望我回答了你的问题。

关于asp.net - Application_Start 与 OnInit 与构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3318130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com