【问题标题】:When to use Application_Start vs Init in Global.asax?何时在 Global.asax 中使用 Application_Start 与 Init?
【发布时间】:2026-02-08 02:30:02
【问题描述】:

我想知道在什么情况下我应该将应用程序初始化代码放在 Application_Start()Init() 中的 Global.asax 文件中?

两者之间的区别对我来说似乎不是很明显,除了首先调用Application_start,然后调用Init()

  • 我为什么要使用一个而不是另一个?
  • 真的有影响吗?
  • 应用程序状态发生了哪些变化 在这两个事件之间?

到目前为止,我能找到的唯一真正的指针是 IHttpModule 只有一个 Init() 方法,所以如果我正在做的事情可能在某些时候更适合实现 IHttpModule 我应该使用 @987654329 Global.asax 的 @ 方法,如果没有其他一致性。

【问题讨论】:

    标签: asp.net global-asax


    【解决方案1】:

    来自MSDN docs

    Application_Start 和 Application_End 方法是不代表 HttpApplication 事件的特殊方法。 ASP.NET 在应用程序域的生命周期内调用它们一次,而不是为每个 HttpApplication 实例调用一次

    初始化:

    为每个实例调用一次 毕竟 HttpApplication 类 模块已创建。

    更新:如果您需要确保某个代码在应用程序中只被调用一次。生命周期,Application_Start 是一个更好的解决方案。示例:配置 log4net?

    【讨论】:

    • 一个后续问题:HttpApplication 的实例是什么时候创建的?我假设每次重新启动工作进程时,它都会为每个工作线程包含一个实例?
    • @roryf - asp.net 维护着一个可重复使用的应用程序实例池。在幕后,使用 CLR 线程池为请求提供服务,传入的请求将排队超过某个阈值。我怀疑他们将应用程序实例池初始化为该阈值级别,因为大多数站点不会看到这种流量。我怀疑他们使用少量实例创建池,然后随着需求的增加而增加池的大小。
    【解决方案2】:

    是的

    它们之间存在差异。 Application_Start() 事件只调用一次,而 Init() 方法在每次创建应用程序实例时调用。

    【讨论】: