Ответ 1
В классическом (устаревшем) ASP существует несколько специальных имен функций, которые, если они определены в вашем файле global.asa, будут выполняться в определенных точках во время жизненного цикла приложения. Они определяются как:
- Application_OnStart - запускается один раз, когда ваше приложение получает первый HTTP-запрос и непосредственно перед обработкой любых файлов .ASP.
- Application_OnEnd - запускается один раз при завершении работы приложения после обработки всех запросов.
- Session_OnStart - запускается в начале каждого уникального сеанса пользователя. Если пользователь/клиент отключил cookies, это выполняется для каждого запроса, поскольку 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/кодирования.