Kiedy używać Application_Start vs Init w Global.asax?

79

Zastanawiam się, w jakich okolicznościach powinienem umieszczać kod inicjalizacji aplikacji w pliku Application_Start()vs Init()w moim Global.asaxpliku?

Różnica między tymi dwoma nie wydaje mi się zbyt oczywista, poza tym, że Application_startnajpierw zostaje wywołana Init().

  • Dlaczego miałbym używać jednego nad drugim?
  • Czy to naprawdę robi różnicę?
  • Jakie zmiany w stanie aplikacji między dwoma zdarzeniami?

Jak dotąd jedynym prawdziwym wskaźnikiem, jaki mogę znaleźć, jest to, że IHttpModulema tylko Init()metodę, więc jeśli to, co robię, może w pewnym momencie być lepiej dostosowane do implementacji IHttpModule, powinienem użyć Init()metody Global.asax, jeśli nic innego, dla spójności.

roryf
źródło

Odpowiedzi:

89

Z dokumentów MSDN :

Metody Application_Start i Application_End są metodami specjalnymi, które nie reprezentują zdarzeń HttpApplication. ASP.NET wywołuje je raz przez cały okres istnienia domeny aplikacji, a nie dla każdego wystąpienia HttpApplication .

W tym:

Wywoływana raz dla każdego wystąpienia klasy HttpApplication po utworzeniu wszystkich modułów.

UPDATE: jeśli chcesz się upewnić, że określony kod jest wywoływany tylko raz w aplikacji. cyklu życia, Application_Start jest lepszym rozwiązaniem. Przykłady: konfigurowanie log4net?

Igor Brejc
źródło
4
Trochę pytania uzupełniającego: kiedy jest tworzone wystąpienie HttpApplication? Zakładam, że za każdym razem, gdy proces roboczy jest restartowany i będzie zawierał jedną instancję dla każdego wątku roboczego?
roryf
2
@roryf - asp.net utrzymuje pulę wystąpień aplikacji, których można użyć ponownie. W ramach okładek żądania są obsługiwane przy użyciu puli wątków CLR, a przychodzące żądania będą umieszczane w kolejce powyżej określonego progu. Wątpię, czy zainicjują pulę instancji aplikacji do tego poziomu progowego, ponieważ większość witryn nie widzi tego rodzaju ruchu. Podejrzewam, że tworzą pulę z niewielką liczbą instancji, a następnie zwiększają rozmiar puli w miarę wzrostu popytu.
Joel Fillmore
12

tak

Są między nimi różnice. Zdarzenie Application_Start () jest wywoływane tylko raz, podczas gdy metoda Init () jest wywoływana za każdym razem, gdy tworzona jest instancja aplikacji.

David Gardiner
źródło