Жизненный цикл ASP.NET приложения

Информация в посте не актуальна для ASP.NET 5

Цикл жизни ASP.NET приложения - это все что происходит с ним от его старта, до его завершения.

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

Стадии цикла жизни приложения Asp .Net

Получен первый запрос ресурса нашего Asp .Net приложения

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

  2. В пределах этого домена приложений, создается инстанс класса HostingEnvironment, который предоставляет доступ к информации о нашем приложении, такой как имя и папка, где приложение находится.

Получен первый запрос ресурса нашего Asp .Net приложения

Созданы объекты ядра (происходит для каждого запроса)

Создаются экземпляры классов HttpContext, HttpRequest, HttpResponse.

HttpContext - один из центральных объектов asp .net приложения, который предоставляет множество информации о текущем приложении, о текущем запросе и ответе, предоставляет доступ к сервисам Asp .Net и т.д.

HttpRequest -информация о текущем запросе.

HttpResponse - информация о текущем ответе.

Запросу назначен глобальный объект приложения

Создается экземпляр глобального объекта приложения и назначается для обработки поступившего запроса. Пока я не буду подробно останавливаться на нем, только кратко скажу, что глобальным объектом приложения является либо файл Global.asax, либо если его нет экземпляр класса System.Web.HttpApplication.

Обработка запроса глобальным объектом приложения

Потом происходит обработка запроса, в процессе которой вызываются различные события цикла жизни запроса.

Дальше приложение обрабатывает другие запросы и в конце концов завершается - на этом заканчивается цикл жизни приложения.

Глобальный объект приложения

Давайте теперь более внимательно изучим глобальный объект приложения.

Глобальный объект приложения является файл Global.asax (а если он отсутствует то используется класс System.Web.HttpApplication), который находится в корне веб-приложения. Этот файл используется во всех типах Asp .Net приложений (Web Forms, MVC, WebApi и т.д.), он часть Asp .Net.

Физически он состоит из двух файлов:

  • Global.asax - не представляет практического интереса (но можете изучить его, там все довольно понятно), потому что, не требует внесения каких-либо изменений с нашей стороны.

  • Global.asax.cs - код.

Вот типичный код из автоматически сгенерированного Global.asax.cs для MVC приложения:

namespace WebApplication
{
    public class MvcApplication : System.Web.HttpApplication
    {
	protected void Application_Start()
	{
	    AreaRegistration.RegisterAllAreas();
	    RouteConfig.RegisterRoutes(RouteTable.Routes);
	}
    }
}

MvcApplication - и есть класс представляющий наше приложение - его экземпляр создается и назначается для обработки запросов (имя может быть любым, оно определяется через разметку файла Global.asax и при необходимости может быть изменено).

HttpApplication - базовый класс для Asp .Net приложений - от него нужно наследоваться, чтобы создать собственные классы приложения. От него будут наследоваться классы и MVC и WebApi и WebForms приложений. Он содержит разные свойства и методы, которые могут быть полезны при управлении приложением и текущим запросом.

События цикла жизни приложения

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

Доступ к этим событиям осуществляется через методы Application_Start() и Application_End() - в них мы можем написать код, выполнять, который нужно при старте и завершении приложения, методы не наследуются и не переопределяются - их название - это соглашение.

Обратите внимание эти методы вызывается при старте и завершении приложения, а не при создании и уничтожении экземпляра HttpApplication (во время работы приложения экземпляры HttpApplication могут создаваться и уничтожаться множество раз, во время работы приложения одновременно может существовать множество экземпляров HttpApplication), поэтому внутри этих методов, нужно производить действия только над статическими данными - которые будут влиять на все экземпляры HttpApplication.

Если вы посмотрите внутрь вашего метода Application_Start() - то увидите, что все методы, которые в нем вызываются статические.

Если вам нужно производить действия инициализации, специфичные для отдельного экземпляра HttpApplication, то переопределите метод Init() в наследнике HttpApplication.

Создание экземпляров глобального объекта приложения и обработка ими запросов

Давайте разберемся с важным вопросом - когда же создаются экземпляры класса MvcAppication и как они связаны с обработкой запросов.

Мы уже знаем, что запросы обрабатываются экземплярами класса MvcApplication. Два экземпляра этого класса создаются при старте приложения, один создается для цикла жизни приложения (и в нем вызывается метод ApplicationStart(), а второй для цикла жизни запроса - и занимается обработкой поступившего запроса).

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

  • После того, как экземпляр HttpApplication назначен запросу - он закреплен за ним до конца обработки и отправки ответа клиенту.
  • В один момент времени экземпляр HttpApplication закреплен за одним запросом.
  • Один экземпляр HttpApplication может обработать множество запросов последовательно, преждем чем будет уничтожен.

Ссылки

  1. ASP.NET Application Life Cycle Overview for IIS 5.0 and 6.0
  2. ASP.NET Application Life Cycle Overview for IIS 7.0
  3. HttpApplication instances
Written on July 8, 2014