В классическом (устаревшем) ASP есть несколько имен специальных функций, которые, если они определены в вашем файле global.asa, будут выполняться в указанных точках в течение жизненного цикла приложения. Они определены как:
- Application_OnStart - запускается один раз, когда ваше приложение получает первый HTTP-запрос и непосредственно перед обработкой любых файлов .ASP.
- Application_OnEnd - запускается один раз, во время завершения работы приложения, после обработки всех запросов.
- Session_OnStart - запускается в начале каждого уникального пользовательского сеанса. Если у пользователя / клиента отключены файлы cookie, они выполняются для каждого запроса, поскольку ASP никогда не обнаруживает файл cookie сеанса, идентифицирующий существующий сеанс.
- Session_OnEnd - (теоретически!) Запускается каждый раз, когда заканчивается сеанс пользователя. Удачи с этим.
Они в основном встроены в классическую среду выполнения ASP - их нельзя изменить, и вы не можете присоединить к этим событиям другие методы.
В ASP.NET есть вещь, называемая AutoEventWireup
, которая использует отражение для поиска методов, соответствующих определенным соглашениям об именах, и запускает эти методы в ответ на совпадающие события, вызванные средой выполнения ASP.NET. Наиболее распространенным примером является метод Page_Load
, который автоматически вызывается в ответ на класс Page, вызывающий событие Load в течение жизненного цикла страницы.
Тот же метод используется для присоединения обработчиков к событиям жизненного цикла уровня приложения. Он будет искать методы с именем ModuleName_EventName или ModuleName_OnEventName без параметров ()
или (object sender, EventArgs e)
Вот забавная часть - , если вы определите более одного метода сопоставления, только тот, который появится в файле последним, будет выполнять . (Последний метод выигрывает, в основном)
Так что если ваш global.asax.cs выглядит так:
public class Global : System.Web.HttpApplication {
protected void Application_Start() {
Debug.WriteLine("A: Application_Start()");
}
protected void Application_Start(object sender, EventArgs e) {
Debug.WriteLine("B: Application_Start(object sender, EventArgs e)");
}
protected void Application_OnStart() {
Debug.WriteLine("C: Application_OnStart()");
}
protected void Application_OnStart(object sender, EventArgs e) {
Debug.WriteLine("D: Application_OnStart(object sender, EventArgs e)");
}
}
вы увидите сообщение D в выходных данных отладки; если вы закомментируете последний метод в этом блоке, вместо этого вы увидите сообщение C.
Итак - используйте любое соглашение о присвоении имен, которое вам нравится, но если вы определите более одного, будет выполняться только тот, который появится последним в вашем исходном файле. Лично я бы придерживался Application_Start(object sender, EventArgs e)
, поскольку это сигнатура, сгенерированная шаблонами проектов Visual Studio и большинством инструментов разработки / кодирования .NET.