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

81

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

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

  • 为什么会选择一个而不是另一个呢?
  • 它真的有什么区别吗?
  • 在这两个事件之间应用程序状态发生了什么变化?

到目前为止,我唯一能找到的指针是IHttpModule只有一个Init()方法,因此如果我所做的事情在某些时候更适合实现IHttpModule,那么我应该使用Global.asaxInit()方法,即使出于一致性考虑。

2个回答

90

根据MSDN文档:

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

Init:

在所有模块被创建之后,每个HttpApplication实例都会调用一次

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


5
跟进问题:HttpApplication实例是在什么时候创建的?我假设每次工作进程重启时,它都会包含一个实例,每个工作线程都有一个实例?答案:HttpApplication实例在第一次处理HTTP请求时被创建。对于每个工作进程,将为其创建一个HttpApplication实例,并且每个工作线程都将使用该实例进行请求处理。如果工作进程重新启动,则会创建新的HttpApplication实例。 - roryf
3
@roryf - asp.net维护一个应用程序实例池,可以重复使用。在内部,请求使用CLR线程池进行服务,当传入的请求超过一定阈值时,它们将被排队等待。我怀疑他们不会将应用程序实例池初始化到该阈值级别,因为大多数网站不会有那种流量。我认为他们会创建一个具有少量实例的池,然后随着需求的增加而增加池的大小。 - Joel Fillmore

12

是的

它们之间有所不同。Application_Start()事件只被调用一次,而Init()方法在每次创建应用程序实例时都会被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接