Подтвердить что ты не робот

Разница между Application_Start и Application_OnStart

Я в процессе добавления ASP.NET MVC-кода в существующий проект ASP.NET Webforms. различные учебники предлагают добавить маршрутизацию к методу, вызванному из Application_Start() в Global.asax. У моего Global.asax уже есть метод Application_OnStart (Object, EventArgs) с некоторым кодом настройки.

Если я попытаюсь запустить Start и OnStart, OnStart не будет вызван (и установка завершится с ошибкой). Похоже, я должен выбрать тот или другой.

Мой вопрос: какой я должен использовать? В чем разница между ними? Вызываются ли они в разное время?

(Примечание: на момент написания этой статьи top три Google хиты бесполезны и/или вводят в заблуждение. Я надеюсь, что Qaru может это исправить.)

4b9b3361

Ответ 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/кодирования.

Ответ 2

Согласно Microsoft docs в жизненном цикле приложений ASP.Net, вы должны использовать метод Application_start внутри файла global.asax:

Application_Start: вызывается, когда запрашивается первый ресурс (например, страница) в приложении ASP.NET. Метод Application_Start вызывается только один раз в течение жизненного цикла приложения. Вы можете использовать этот метод для выполнения задач запуска, таких как загрузка данных в кеш и инициализация статических значений.

Application_OnStart: Событие Application_OnStart происходит до создания первого нового сеанса (когда объект приложения сначала ссылается). Это происходит в Global.asa, а не global.asax.

Ответ 3

Application_OnStart:

Функция Application_OnStart вызывается до того, как будут обработаны любые файлы .asp, прежде чем какой-либо текст или графика будут отображены и отправлены в браузер пользователя. В рамках этой функции следующий вызов метода CreateObject объекта Active Server Pages Server создает объект RenderingApplication библиотеки CDO RenderingApplication. Если этот вызов завершается успешно, переменная objRenderApp содержит указатель на новый объект.

Все ссылки, которые я смог найти, относятся к страницам .asp

Application_Start

Методы Application_Start и Application_End - это специальные методы, которые не представляют события HttpApplication. ASP.NET называет их один раз для срока службы домена приложения, а не для каждого экземпляра HttpApplication.

Эта страница относится к страницам .aspx. Так как вы используете MVC и упоминаете global.asax, это тот, который вы должны использовать.