Monday, November 30, 2015

Обработка запросов в ASP.NET

Здравствуйте, уважаемые читатели. Цель сегодняшней статьи заключается в том, чтобы познакомить вас с некоторыми аспектами обработки запросов ASP.NET MVC (The Request Process Pipeline). Статья скомпонирована в большей степени с разных источников, чтобы собрать основную информацию, среди которой вы можете найти ответы на ваши вопросы по этой теме, в одно целое. Один из самых сложных вопросов, которые часто задают на собеседовании для разработчиков ASP.NET middle/senior квалификации, является вопрос: “Что происходит с HTTP-запросом от момента его поступления на 80-й порт и до передачи управления странице?”. Основная сложность данного вопроса заключается в том, что когда я с ним начал разбираться, то понял, что в поисках решения можно закопаться еще глубже. Единственная книга, в которой это хоть как-то расписано, – "Pro ASP.NET MVC Framework". Перевод отрывка с данной книги приведен на хабрахабр. Я рекомендую вам внимательно перечитать несколько раз эту статью. Ниже приведена диаграмма того как это работает.
На этой схеме видно только момент, когда запрос уже на уровне маршрутизации, и что за чем происходит. Вы можете сами посмотреть, как это все реализовано, на referencesource. В общем, после прочтения данной статьи вы сможете понять, как срабатывает маршрутизация, контролеры и actions.
Но в статье выше чего-то не хватает. А именно  информации о том, как IIS отрабатывает, как рабочий процесс загружает ASP.NET ISAPI, какую роль играет рабочий процесс w3wp.exe, как отрабатывает HTTP.sys, и что это вообще такое. Здесь нам на помощь приходит следующая статья: "Основы архитектуры IIS, или запросопровод для ASP.NET" с хабархабр. Она является расширением статьи "Introduction to IIS Architectures" автора Реган Темплин (Reagan Templin). Статья действительно очень толковая. Жаль только, что я ее увидел только сейчас. Пришлось перечитывать раза 3-4 до полного понимания процесса. В целом, весь процесс схематически представлен на рисунке ниже.
Наш http-запрос проходит по следующей цепочке:
  1. Браузер обращается к веб-серверу по определённому URL, на стороне сервера запрос перехватывает драйвер HTTP.SYS.
  2. HTTP.SYS стучится к WAS для получения информации из хранилища конфигурации.
  3. Служба WAS запрашивает конфигурацию из хранилища  из файла в папке IIS (applicationHost.config).
  4. Поскольку данный запрос получен по протоколу HTTP, конфигурационную информацию получает служба W3SVC (она же WWW Service на рисунке), эта информация содержит в себе данные о пуле приложений (application pool) и прочих параметрах сайта.
  5. Служба W3SVC использует эту информацию для конфигурации HTTP.SYS.
  6. Служба WAS запускает процесс W3WP.exe для пула приложений, если он ещё не был запущен.
  7. В процессе W3WP.exe работает приложение веб-сайта, которое, собственно, формирует и возвращает ответ драйверу HTTP.SYS.
  8. HTTP.SYS отправляет ответ браузеру.
Весь текст взят его со статьи на хабрахабр. Надеюсь, автора статьи на меня не обидятся. Сейчас получилось достаточно неплохо. У нас есть статья, которая расписывает о том, как отрабатывает IIS; есть статья, которая показывает, как этот запрос проходит в real-time. Но чего-то не хватает. Не хватает завершения того, как же приходит ответ конечному пользователю. А проходит этот запрос следующую цепочку событий.
Этот процесс показывает нам, как обрабатывается запрос от пользователя. Этот вопрос может попасть вам на экзамене 70-486 Developing ASP.NET MVC 4 Web Applications. Более детальную информацию о том, как это работает, вы можете почерпнуть с Microsoft Virtual Academy с курса "Приступаем к созданию веб-приложений ASP.NET MVC 4".
Давайте кратко подытожим, как же это все работает.
  • Запрос вашей страницы выдается с браузера
  • Запрос достигает IIS и перехватывается HTTP.sys
  • Затем драйвер HTTP.sys пересылается пулу приложений
  • Затем рабочий процесс пула w3wp.exe загружает ASP.NET ISAPI (“aspnet_isapi.dll”), изучает url и связывает ваше расширение с aspnet_isapi.
  • ISAPI загружает среду выполнения HTTP (HttpRuntime)
  • Среда выполнения HTTP создает HttpContext и связывает запрос с HttpApplication
  • Запрос проходит через конвейер HTTP
  • Модули HTTP выполняются для запроса, пока запрос не попадает в обработчик HTTP страницы ASP.NET
  • Как только запрос покидает конвейер HTTP, начинается жизненный цикл страницы.
Более детально обо всем этом можно почитать в статье "ВНУТРЕННЕЕ УСТРОЙСТВО ASP.NET: АРХИТЕКТУРА ЗАПРОСА", материал которой я считаю вполне достойным. Ну и напоследок  жизненный цикл страницы для ASP.NET 4.0 WebForms, которую я одолжил с хабрахабр.
Вот более актуальная схема для разработчиков ASP.NET MVC 5, которая взята с официального сайта по ASP.NET со статьи "Lifecycle of an ASP.NET MVC 5 Application".
Детализированный вариант:

Итоги

Сегодня мы кратко рассмотрели, как обрабатываются запросы в ASP.NET MVC (request processing pipeline). Рассмотрели кратко три статьи, которые позволяют сложить всю картинку целиком. Целью этой статьи я ставил себе собрать все воедино, чтобы доступиться ко всему этому с одного места. А во-вторых, это отличный способ упорядочить свои знания, которые, надеюсь, пригодятся мне для прохождения сертификации по 70-486. Надеюсь. вы здесь также найдете для себя что-то полезное. 

No comments:

Post a Comment