Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0

Visual Studio 2010

Обновлен: Ноябрь 2007

В этом разделе приводится общее описание жизненного цикла приложений ASP.NET, перечисляются важные события, связанные с жизненным циклом, и описывается создание кода соответственно жизненному циклу приложения. Сведения этого раздела применимы к службам IIS 5.0 и IIS 6.0. Сведения о жизненном цикле приложения ASP.NET в службе IIS 7.0 см. в разделе Общие сведения о жизненном цикле приложения ASP.NET для служб IIS 7.0.

В среде ASP.NET для инициализации и обработки запросов должны быть выполнены несколько процессов для приложений ASP.NET. Кроме того, ASP.NET является единственным сегментом веб-сервера, обслуживающим запросы, созданные обозревателем. Важно понимать жизненный цикл приложения, чтобы можно было написать код соответственно этапу жизненного цикла для получения планируемого эффекта.

В следующей таблице описываются этапы жизненного цикла приложения ASP.NET.

Этап

Описание

Пользователь запрашивает ресурс приложения с веб-сервера.

Жизненный цикл приложения ASP.NET начинается с запроса, отправленного обозревателем на веб-сервер (для приложений ASP.NET, как правило, — службу IIS). ASP.NET является расширением ISAPI на веб-сервере. Когда веб-сервер получает запрос, он проверяет расширение имени запрошенного файла, определяет, какое расширение ISAPI должен обработать запрос, и затем передает запрос соответствующему расширению ISAPI. ASP.NET обрабатывает расширения имени файла, сопоставленные ему, такие как aspx, ascx, ashx и asmx.

ms178473.alert_note(ru-ru,VS.100).gifПримечание.
Если расширение имени файла не сопоставлено ASP.NET, приложение не получит запрос. Это важно понимать относительно приложений, использующих проверку подлинности ASP.NET. Например, поскольку htm-файлы обычно не сопоставлены ASP.NET, это приложение не выполняет проверку подлинности или авторизацию запросов htm-файлов. Поэтому даже если файлы содержат статическое содержимое, если требуется, чтобы приложение ASP.NET выполняло проверку подлинности, создайте файл с использованием расширения имени файла, сопоставленного ASP.NET, например — aspx.
ms178473.alert_note(ru-ru,VS.100).gifПримечание.
Если создается пользовательский обработчик для обработки отдельного расширения имени файла, необходимо сопоставить расширение приложению ASP.NET в IIS, а также зарегистрировать обработчик в файле Web.config приложения. Дополнительные сведения см. в разделе Общие сведения об обработчиках HTTP-данных и HTTP-модулях.

ASP.NET получает первый запрос для приложения.

Когда ASP.NET получает первый запрос для какого-либо ресурса в приложении, класс с именем ApplicationManager создает домен приложения. Домены приложений обеспечивают изоляцию между приложениями для глобальных переменных и позволяют каждому приложению выгружаться отдельно. В домене приложения создается экземпляр класса HostingEnvironment, обеспечивающий доступ к сведениям о приложении, таким как имя папки, в которой хранится приложение.

Эти отношения показаны на следующей схеме:

График общих сведений топографии приложения

ASP.NET также компилирует элементы верхнего уровня в приложении, если требуется, включая код приложения, в папке App_Code. Дополнительные сведения см. в подразделе "Жизненный цикл компиляции" далее в этом разделе.

Для каждого запроса создаются базовые объекты ASP.NET.

После того как создан домен приложения и экземпляр объекта HostingEnvironment ASP.NET создает и инициализирует базовые объекты, такие как HttpContext, HttpRequest и HttpResponse. Класс HttpContext содержит отдельные объекты для каждого текущего запроса предложения, такие как объекты HttpRequest и HttpResponse. Объект HttpRequest содержит сведения о текущем запросе, включая файлы "cookies" и сведения об обозревателе. Объект HttpResponse содержит ответ, который отправляется клиенту, включая все отображенные выводы и файлы "cookies".

Объект HttpApplication, назначен запросу

После того как все объекты приложения инициализированы, приложение запускается созданием экземпляра класса HttpApplication. Если приложение содержит файл Global.asax, вместо этого ASP.NET создает экземпляр класса Global.asax, который происходит из класса HttpApplication, и использует производный класс для представления приложения.

ms178473.alert_note(ru-ru,VS.100).gifПримечание.
При первом запросе в приложении страницы или процесса ASP.NET создается новый экземпляр HttpApplication. Однако в целях максимальной производительности экземпляры HttpApplication могут повторно использоваться для нескольких запросов.

При создании экземпляра класса HttpApplication создаются также любые сконфигурированные модули. Например, если в приложении сконфигурировано такое действие, ASP.NET создает модуль SessionStateModule. После создания всех сконфигурированных модулей вызывается метод Init класса HttpApplication.

Эти отношения показаны на следующей схеме:

График окружения приложения

Запрос обрабатывается конвейером HttpApplication.

Во время обработки запроса класс HttpApplication создает следующие события. Эти события особенно интересны для разработчиков, которые хотят расширить класс HttpApplication.

  1. Проверка запроса, при которой проверяются сведения, отправленные обозревателем, и определяется, содержит ли он потенциально вредоносную разметку. Дополнительные сведения см. в разделах ValidateRequest и Общие сведения об использовании сценариев.

  2. Сопоставление URL-адреса, если какие-либо URL-адреса были сконфигурированы в разделе UrlMappingsSection файла Web.config.

  3. Создание события BeginRequest.

  4. Создание события AuthenticateRequest.

  5. Создание события PostAuthenticateRequest.

  6. Создание события AuthorizeRequest.

  7. Создание события PostAuthorizeRequest.

  8. Создание события ResolveRequestCache.

  9. Создание события PostResolveRequestCache.

  10. На основе расширения имени файла запрошенного ресурса (сопоставленного в файле конфигурации приложения) выберите класс, реализующий объект IHttpHandler для обработки запроса. Если объект (страница) запроса является производным от класса Page, и страница должна быть скомпилирована, ASP.NET компилирует страницу до создания его экземпляра.

  11. Создание события PostMapRequestHandler.

  12. Создание события AcquireRequestState.

  13. Создание события PostAcquireRequestState.

  14. Создание события PreRequestHandlerExecute.

  15. Вызов метода ProcessRequest (или асинхронной версии IHttpAsyncHandler.BeginProcessRequest) соответствующего класса IHttpHandler для запроса. Например, если запрашивается страница, запрос обрабатывает текущий экземпляр страницы.

  16. Создание события PostRequestHandlerExecute.

  17. Создание события ReleaseRequestState.

  18. Создание события PostReleaseRequestState.

  19. Фильтрация ответов, если определено свойство Filter.

  20. Создание события UpdateRequestCache.

  21. Создание события PostUpdateRequestCache.

  22. Создание события EndRequest.

  23. Создание события PreSendRequestHeaders.

  24. Создание события PreSendRequestContent.

Во время жизненного цикла приложение создает события, которые можно обработать, или вызывают отдельные методы, которые можно переопределить. Для обработки событий или методов приложения можно создать файл с именем Global.asax в корневом каталоге приложения.

Если создан файл Global.asax, ASP.NET компилирует его в класс, производный от класса HttpApplication, и затем использует производный класс для представления приложения.

Экземпляр класса HttpApplication обрабатывает только один запрос одновременно. Это упрощает обработку события приложения, так как не требуется блокировать нестатические члены в классе приложения при обращении к ним. Это также позволяет сохранять данные отдельного запроса в нестатических членах класса приложения. Например, можно определить свойство в файле Global.asax и назначить ему значение отдельного запроса.

ASP.NET автоматически привязывает события приложения к обработчикам в файле Global.asax с помощью соглашения об именах Application_событие, например, Application_BeginRequest. Это такой же способ, с помощью которого методы страницы ASP.NET автоматически привязываются к событиям, таким как событие Page_Load страницы. Подробные сведения см. в разделе Общие сведения о жизненном цикле веб-страниц ASP.NET.

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

В следующей таблице перечислены некоторые события и методы, используемые во время жизненного цикла приложения. Существует намного больше событий, чем перечислено, но они обычно не используются.

Событие или метод

Описание

Application_Start

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

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

Application_event

Создается в соответствующий момент в жизненном цикле приложения, как указано в таблице жизненного цикла приложения ранее в этом разделе.

Application_Error может создаваться на любом этапе жизненного цикла приложения.

Application_EndRequest является единственным событием, которое гарантированно создается в каждом запросе, так как запрос может быть сокращенным. Например, если два модуля обрабатывают событие Application_BeginRequest, и первый создает исключение, Application_BeginRequest событие не будет вызвано для второго модуля. Однако метод Application_EndRequest всегда вызывается, чтобы разрешить приложению очистить ресурсы.

Init

Вызывается один раз для каждого экземпляра класса HttpApplication после создания всех модулей.

Dispose

Вызывается до уничтожения экземпляра приложения. Этот метод можно использовать для отключения вручную от любых неуправляемых ресурсов. Дополнительные сведения см. в разделе Очистка неуправляемых ресурсов.

Application_End

Вызывается один раз в течение жизненного цикла приложения до его выгрузки.

При первом запросе к приложению, ASP.NET компилирует элементы приложения в определенном порядке. Первые скомпилированные элементы должны иметь ссылку как элементы верхнего уровня. После первого запроса элементы верхнего уровня перекомпилируются, только если изменяются зависимости. В следующей таблице описывается порядок, в котором компилируются элементы верхнего уровня ASP.NET.

Элемент

Описание

App_GlobalResources

Компилируются глобальные ресурсы приложения и строится сборка ресурса. Любые сборки в папке Bin приложения связаны со сборкой ресурса.

App_WebResources

Создаются и компилируются типы прокси для веб-служб. Итоговая сборка веб-ссылок связана со сборкой ресурса, если он существует.

Свойства профиля, определенные в файле Web.config

Если свойства профиля определены в файле Web.config приложения, создается сборка, содержащая объект профиля.

App_Code

Строятся файлы исходного кода и создается одна или несколько сборок. Все сборки кода и сборки профиля связаны с ресурсами и сборками веб-ссылок, если таковые имеются.

Global.asax

Объект приложения компилируется и связывается со всеми предыдущими созданными сборками.

После компиляции элементов верхнего уровня приложения ASP.NET компилирует папки, страницы и другие элементы при необходимости. В следующей таблице описывается порядок, в котором компилируются папки и элементы ASP.NET.

Элемент

Описание

App_LocalResources

Если папка, содержащая запрошенный элемент, содержит папку App_LocalResources, содержимое локальной папки ресурсов компилируется и связывается с глобальной сборкой ресурсов.

Отдельные веб-страницы (aspx-файлы), пользовательские элементы управления (ascx-файлы), обработчики HTTP (ashx-файлы) и модули HTTP (asmx-файлы)

Скомпилированы соответственно потребностям и связаны с локальной сборкой ресурсов и сборками верхнего уровня.

Схемы, главные страницы и другие исходные файлы

Файлы обложки для отдельных схем, главные страницы и другие файлы исходных кодов, на которые имеются ссылки со страниц, компилируются во время компиляции страниц со ссылками.

Скомпилированные сборки кэшируются на сервере и повторно используются в последующих запросах и сохраняются в повторно запускаемых приложениях, пока не будет изменен исходный код.

Так как при первом запросе компилируется приложение, начальный запрос приложению может занять значительно больше времени, чем последующие. Чтобы сократить время, требуемое первому запросу, можно предварительно скомпилировать приложение. Дополнительные сведения см. в разделе Практическое руководство. Предварительная компиляция веб-узлов ASP.NET.

Перезапуск приложения

Изменение исходного кода веб-приложения приводит к повторной компиляции компонентом ASP.NET исходных файлов в сборки. При изменении элементов верхнего уровня в приложении все другие сборки в приложении, имеющие ссылки на сборки верхнего уровня, также перекомпилируются.

Кроме того, изменение, добавление или удаление определенных типов файлов в папках, связанных с приложением, приводит к перезапуску приложения. К перезапуску приложения приводят следующие действия:

  • Добавление, изменение или удаление сборок из папки Bin приложения.

  • Добавление, изменение или удаление ресурсов локализации из папок App_GlobalResources или App_LocalResources.

  • Добавление, изменение или удаление файла Global.asax приложения.

  • Добавление, изменение или удаление файлов исходного кода в каталоге App_Code.

  • Добавление, изменение или удаление конфигурации профиля.

  • Добавление, изменение или удаление ссылок веб-службы в каталоге App_WebReferences.

  • Добавление, изменение или удаление файла приложения Web.config.

Если требуется перезапустить приложение, ASP.NET выполнит обслуживание всех ожидающих запросов из существующего домена приложения и старых сборок до перезапуска домена приложения и загрузки новых сборок.

Жизненный цикл приложения ASP.NET может расширяться через классы IHttpModule. ASP.NET включает несколько классов, реализующих IHttpModule, таких как класс SessionStateModule. Можно также создать собственный класс, реализующий IHttpModule.

При добавлении к приложению модулей, они сами могут создавать события. Приложение может выполнить подписку в этих событиях в файле Global.asax с помощью соглашения имямодуля_имясобытия. Например, для обработки события Authenticate, созданного объектом FormsAuthenticationModule, можно создать обработчик с именем FormsAuthentication_Authenticate.

Класс SessionStateModule включен по умолчанию в ASP.NET. Все события сеанса автоматически реализуются как Session_событие, например, Session_Start. Событие Start создается каждый раз при создании нового сеанса. Дополнительные сведения см. в разделе Общие сведения о состоянии сеанса ASP.NET.

Показ: