何时在Global.asax中使用Application_Start与Init?


79

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

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

  • 为什么我要一个使用另一个?
  • 真的有区别吗?
  • 两个事件之间的应用程序状态有哪些变化?

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

Answers:


89

MSDN文档

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

在里面:

创建所有模块后,对HttpApplication类的每个实例调用一次

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


4
后续问题:何时创建HttpApplication实例?我假设每次重新启动工作进程,每个工作线程将包含一个实例?
roryf

2
@roryf-asp.net维护可以重用的应用程序实例池。在幕后,使用CLR线程池为请求提供服务,传入的请求将排队超过特定阈值。我怀疑他们会将应用程序实例池初始化为该阈值级别,因为大多数站点不会看到这种流量。我怀疑他们用少量实例创建了池,然后随着需求的增加而增加了池的大小。
Joel Fillmore

12

它们之间有区别。创建应用程序实例时,每次都会调用一次Application_Start()事件,而每次都会调用Init()方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.