Здравствуйте, уважаемые читатели. Цель сегодняшней
статьи заключается в том, чтобы познакомить вас с некоторыми аспектами
обработки запросов 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-запрос проходит по
следующей цепочке:
- Браузер обращается к веб-серверу по определённому URL, на стороне сервера запрос перехватывает драйвер HTTP.SYS.
- HTTP.SYS стучится к WAS для получения информации из хранилища конфигурации.
- Служба WAS запрашивает конфигурацию из хранилища – из файла в папке IIS (applicationHost.config).
- Поскольку данный запрос получен по протоколу HTTP, конфигурационную информацию получает служба W3SVC (она же WWW Service на рисунке), эта информация содержит в себе данные о пуле приложений (application pool) и прочих параметрах сайта.
- Служба W3SVC использует эту информацию для конфигурации HTTP.SYS.
- Служба WAS запускает процесс W3WP.exe для пула приложений, если он ещё не был запущен.
- В процессе W3WP.exe работает приложение веб-сайта, которое, собственно, формирует и возвращает ответ драйверу HTTP.SYS.
- 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