Wann wird Application_Start vs Init in Global.asax verwendet?

79

Ich frage mich, unter welchen Umständen ich den Anwendungsinitialisierungscode in Application_Start()vs Init()in meine Global.asaxDatei einfügen soll .

Die Unterscheidung zwischen den beiden scheint mir nicht sehr offensichtlich zu sein, außer dass Application_startsie zuerst aufgerufen wird Init().

  • Warum sollte ich eins über das andere verwenden?
  • Macht es wirklich einen Unterschied?
  • Welche Änderungen im Anwendungsstatus zwischen den beiden Ereignissen?

Bisher ist der einzige echte Zeiger, den ich finden kann, der IHttpModulenur eine Init()Methode hat. Wenn das, was ich tue, irgendwann besser für die Implementierung geeignet ist, IHttpModulesollte ich die Init()Methode von verwenden Global.asax, wenn nichts anderes für die Konsistenz.

roryf
quelle

Antworten:

89

Aus den MSDN-Dokumenten :

Die Methoden Application_Start und Application_End sind spezielle Methoden, die keine HttpApplication-Ereignisse darstellen. ASP.NET ruft sie einmal für die Lebensdauer der Anwendungsdomäne auf, nicht für jede HttpApplication-Instanz .

Drin:

Genannt einmal für jede Instanz der Httpapplication - Klasse , nachdem alle Module erstellt wurden.

UPDATE: Wenn Sie sicherstellen müssen, dass ein bestimmter Code in der App nur einmal aufgerufen wird. Im Lebenszyklus ist Application_Start eine bessere Lösung. Beispiele: log4net konfigurieren?

Igor Brejc
quelle
4
Eine kleine Frage: Wann wird eine Instanz von HttpApplication erstellt? Ich gehe davon aus, dass der Worker-Prozess jedes Mal neu gestartet wird und eine Instanz für jeden Worker-Thread enthält.
Roryf
2
@roryf - asp.net verwaltet einen Pool von Anwendungsinstanzen, die wiederverwendet werden können. Unter dem Deckmantel werden Anforderungen mithilfe des CLR-Threadpools bearbeitet, und eingehende Anforderungen werden über einen bestimmten Schwellenwert hinaus in die Warteschlange gestellt. Ich bezweifle, dass sie den Anwendungsinstanzpool auf diesen Schwellenwert initialisieren, da die meisten Websites diese Art von Datenverkehr nicht sehen. Ich vermute, dass sie den Pool mit einer kleinen Anzahl von Instanzen erstellen und dann den Pool vergrößern, wenn die Nachfrage steigt.
Joel Fillmore
12

Ja

Es gibt Unterschiede zwischen ihnen. Das Application_Start () -Ereignis wird nur einmal aufgerufen, während die Init () -Methode jedes Mal aufgerufen wird, wenn eine Instanz der Anwendung erstellt wird.

David Gardiner
quelle