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

标签 asp.net lifecycle httpapplication app-startup

自从 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/

相关文章:

asp.net - 异步 HttpApplication 事件会等到它们返回吗?

c# - 我应该为小型 dotnet 应用程序使用什么数据库?

c# - 如何将文件保存到物理路径?

events - 如何在 Svelte 组件安装之前获取数据?

c# - 限制 Active Directory 计算机组访问 .Net 网站

ASP.Net session 状态

c# - Asp.net MVC 如何从 Controller 打开新窗口

c# - 用于创建存储库的脚手架模板

java - Android - 从渲染线程中结束 Activity

android - 重新启动 Activity 中的 fragment