Разница между Application_Start и Application_OnStart - PullRequest
37 голосов
/ 13 января 2010

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

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

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

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

Ответы [ 3 ]

73 голосов
/ 13 января 2010

В классическом (устаревшем) 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.

10 голосов
/ 13 января 2010

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

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

Application_OnStart: событие Application_OnStart наступает до того, как будет создан первый новый сеанс (при первом обращении к объекту Application). Это относится к Global.asa , а не к global.asax.

5 голосов
/ 13 января 2010

Application_OnStart * * 1004

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

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

Application_Start

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

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

...