Уровень приложения ASP.NET против уровня сеанса и Global.asax ... запутался - PullRequest
3 голосов
/ 08 января 2011

Следующий текст взят из книги, которую я читаю, «MCTS Self-Paced Training Kit (Exam 70-515) Разработка веб-приложений с ASP.NET 4». Он дает краткое изложение жизненного цикла приложения. *

  1. Пользователь сначала делает запрос на страницу на вашем сайте.
  2. Запрос направляется в конвейер обработки, который перенаправляет его в среду выполнения ASP.NET.
  3. Среда выполнения ASP.NET создает экземпляр класса ApplicationManager; этот экземпляр класса представляет домен .NET Framework, который будет использоваться для выполнения запросов вашего приложения. Домен приложения изолирует глобальные переменные от других приложений и позволяет каждому приложению загружать и выгружать отдельно, как требуется.
  4. После создания домена приложения создается экземпляр класса HostingEnvironment. Этот класс обеспечивает доступ к элементам внутри среды размещения, таким как папки каталогов.
  5. ASP.NET создает экземпляры основных объектов, которые будут использоваться для обработки запроса. Сюда входят объекты HttpContext, HttpRequest и HttpResponse.
  6. ASP.NET создает экземпляр класса HttpApplication (или экземпляр используется повторно). Этот класс также является базовым классом для файла Global.asax сайта. Вы можете использовать этот класс для перехвата событий, которые происходят, когда ваше приложение запускается или останавливается. Когда ASP.NET создает экземпляр HttpApplication, он также создает модули, настроенные для приложения, такие как SessionStateModule.
  7. Наконец, ASP.NET обрабатывает запрос через пиплину HttpApplication. Этот конвейер также включает в себя набор событий для проверки запросов, сопоставления URL-адресов, доступа к кешу и т. Д.

Затем книга продемонстрировала пример использования файла Global.asax:

   <script runat="server">
void Application_Start(object sender, EventArgs e)
{
Application["UsersOnline"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application["UsersOnline"] = (int)Application["UsersOnline"] - 1;
Application.UnLock();
}
</script>

Когда запускается приложение? В чем разница между сессией и уровнем приложения? Я не совсем понимаю, как это делается. Я думал, что классы уровня приложения «сидят поверх» объекта AppDomain, а AppDomain содержит информацию, специфичную для этого сеанса для этого пользователя. Может кто-нибудь объяснить, как IIS управляет классами уровня Applicaiton и как класс HttpApplication находится в AppDomain? Все ценится.

1 Ответ

3 голосов
/ 09 января 2011

Ничто не живет за пределами AppDomain, поэтому, конечно, HttpApplication должен быть создан внутри одного.

Шаги с 3 по 6 происходят только ОДИН РАЗ в течение срока действия вашего приложения.Когда экземпляр ApplicationManager создан, он не будет создан снова для следующего запроса.То же самое для HostingEnvironment и HttpApplication.Это означает, что значения, хранящиеся в коллекции приложений, будут оставаться там для получения для всех последующих запросов в течение всего времени существования приложения.

Существует один AppDomain на приложение, а не на сеанс или на запрос.

...