Различие между Application_Start и Application_OnStart

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

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

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

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

38
задан Craig Walker 13 January 2010 в 17:01
поделиться

3 ответа

В классическом (устаревшем) ASP есть несколько специальных имен функций, которые, если они определены в вашем файле Global.Asa, будут запущены в указанных точках во время жизненного цикла приложения. Они определены как:

  • Application_Onstart - работает один раз, когда ваше приложение получает первый запрос HTTP и непосредственно перед обработкой файлов .asp.
  • Application_Onend - работает один раз, во время завершения приложения, после обработки всех запросов.
  • Session_OnStart - работает в начале каждого уникальной сеансы пользователей. Если пользователь / клиент имеет отключенные файлы cookie, это работает для каждого запроса, потому что ASP никогда не обнаруживает файл cookie сеанса, идентифицируя существующий сеанс.
  • SESSIC_ONEND - (теоретически!) Работает каждый раз, когда истекает сеанс пользователя. Удачи с этим.

Это в основном в основном подключены к классическому время выполнения ASP - вы не можете их изменить, и вы не можете прикрепить никаких других методов этих событий.

В ASP.NET есть вещь, называемая AUTOEVENTWIREUP , которое использует отражение для поиска методов, соответствующих определенным конвенциям именования, и выполняет эти методы в ответ на соответствующие события, поднятые в выполнении ASP.NET. Наиболее распространенным примером является метод Page_load , который автоматически вызывается в ответ на класс Page Page Page The Load Event нагрузка на жизненном цикле страницы.

Та же методика используется для прикрепления обработчиков к событиям жизненного цикла на уровне нанесения. Он будет искать методы с именем либо ModuleName_eventname или ModuleName_OneVentname, принимая либо нет параметров () , либо (объект отправителя, 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 (отправитель объекта, Eventargs e) , поскольку это подпись, генерируемая шаблонами проекта Visual Studio и большинством .NET Design / Coding Tools.

75
ответ дан 27 November 2019 в 03:19
поделиться

Application_Onstart :

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

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

Application_Start

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

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

5
ответ дан 27 November 2019 в 03:19
поделиться

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

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

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

10
ответ дан 27 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: