ASP.NET Request Processing

Что происходит между вводом в адресную строку браузера URL какого-нибудь сайта и отображением содержимого страницы на экране?


Определение IP-адреса, соответствующего введённому URL

Сначала браузер проверяет свой DNS (Domain Name System) кэш, в котором хранится таблица соответствий URL- и IP-адресов. Если введённый URL найден в кэше браузера, то необходимый IP-адрес определён. По умолчанию, время кэширования DNS, например в Firefox, составляет 60 секунд, что достаточно неудобно при разработке и отладке сайтов. Чтобы убрать кэширование в том же Firefox, нужно ввести в адресную строку about:config, затем найти и отредактировать либо создать запись dnsCacheExpiration, равную 0.

Если введённый URL не найден в кэше браузера (либо отключен), то запрос на соответствие IP-адреса введённому сайту отправляется локальной службе "DNS-клиент". Отключать данную службу не рекомендуется, это повысит нагрузку на сеть (запросы больше не будут кэшироваться) и снизит производительность работы с сетью. Если есть необходимость сбросить локальный кэш, это можно сделать командой:

ipconfig /flushdns

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

Рассмотрим два алгоритма работы DNS (без учёта кэширования):

Итеративный - локальный DNS-агент обращается к DNS-серверу верхнего уровня, который возвращает либо IP-адрес искомого сайта, либо адрес другого DNS-сервера, который рекомендуется, для продолжения запроса. Таким образом, локальный DNS-агент будет выполнять перебор DNS-серверов сам, пока не найдет ответ.

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

Итак, в результате, с помощью DNS браузер узнаёт IP-адрес введённого сайта и знает, куда отправлять запрос.


Отправка HTTP-запроса

Зная IP-адрес сервера и URL запрашиваемого ресурса, браузер устанавливает TCP-соединение с сервером, формирует http-пакет и отправляет его на сервер. Пакет выглядит примерно так:

GET http://msdn.microsoft.com/ru-ru/ HTTP/1.1
Host: msdn.microsoft.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

Верхняя строчка содержит <метод><URL><протокол/версию>

Про GET, POST и другие методы можно почитать в вики.

Отдельное внимание следует уделить полю keep-alive, оно показывает, сколько секунд не разрывать TCP-соединение браузера с сервером. С одной стороны, это экономит время клиента (не нужно на запрос каждого ресурса устанавливать новое TCP-соединение), с другой стороны, это плохо тем, что стандартно серверы имеют ограничение на количество одновременных TCP-соединений с одного IP-адреса. В ситуации, когда у провайдера один внешний IP-адрес (например, 1000 абонентов выходят в интернет с одного IP на один сайт), доступ к сайту получат те, кто открыл сайт первым, остальные будут блокироваться данным ограничением.

Также стоит отметить, что при установке TCP-соединения с сервером (по сути, создания и открытия сокета) указывается определённый порт: для http это стандартно 80, для https - 443 порт. В случае, если на сервере запущен IIS, данный запрос обрабатывается им.

В итоге, на данном этапе сформирован и отправлен на сервер запрос HTTP GET, дальше следует его обработка IIS'ом.


Обработка IIS'ом входящего запроса

Самым низкоуровневым компонентом IIS'а является драйвер режима ядра http.sys. Этот драйвер отвечает за перехват и обслуживание входящих запросов (http и https). Когда мы создаём в IIS новый web-сайт, то этот сайт регистрируется в http.sys. Основная задача этого драйвера - направить HTTP-запрос необходимому процессу, запущенному в пользовательском режиме, который выполняет web-приложение.

Более подробно: http.sys помещает входящий запрос в очередь, управляемую тем Application pool'ом, к которому принадлежит вызываемое приложение, и передаёт запрос на обработку процессу, в котором запущен необходимый Application pool. Каждый Application pool управляется экземпляром процесса w3wp.exe. По умолчанию, данный процесс запускается от имени пользователя NetworkService, что, естественно, можно изменить.

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

Рассмотрим более подробно компоненты IIS 7.

1. Драйвер http.sys, который слушает http- и https-порты, принимает входящие запросы и передаёт их IIS на обработку, после обработки отправляет результат обратно. (В IIS 7 этот драйвер заменил работу с сокетами из пользовательского режима). Очевидные плюсы:

  • Позволяет в режиме ядра осуществлять кэширование (нет необходимости переключаться в пользовательский режим);
  • Добавление запроса в очередь происходит без переключения в пользовательский режим;
  • Он может осуществлять какую-то подготовительную обработку, security фильтрация;

2. World-Wide Web Publishing Service - в IIS 7 он выполняет только роль адаптера для http.sys. Он конфигурирует драйвер (передаёт ему текущие настройки) и сообщает WAS, что запрос поставлен в очередь

3. Windows Process Activation Service (WAS) - отвечает за конфигурацию application pool и рабочих процессов. (Не привязан к http, т.е. одну и ту же конфигурацию можно использовать для http-сайтов и wcf-сервисов). При запуске WAS считывает конфигурацию из файла ApplicationHost.config и передаёт её адаптерам "слушателей" (например, адаптеру http.sys, который конфигурирует непосредственно сам драйвер). В ApplicationHost.config лежит конфигурация протоколов, application pool'а... Если данный конфиг изменяется, WAS уведомляет об этом адаптеры слушателей.

4. Кроме того, WAS управляет рабочим процессом и application pool'ами. Когда слушатель принимает запрос, WAS смотрит запущен ли рабочий процесс. Если у необходимого пула приложений уже есть запущенный рабочий процесс, то адаптер передаёт ему запрос на обработку. В случае, когда для нужного пула приложений процесс не запущен, WAS запускает его. Благодаря тому, что WAS управляет процессами как http так и не http, в одном пуле приложений можно запустить приложения, работающие по различным протоколам (http и net.tcp)

5. IIS 7 Модули (например, authentication modules to authenticate client credentials and cache modules to manage cache activity). Архитектура IIS 7 сконцентрирована не на самом сервере, а на модулях. Можно полностью контролировать список используемых модулей, заменять стандартные своими. Удаление ненужных модулей снижает уязвимость. В IIS 7 введена новая модель обработки запроса (старая, естественно, никуда не делать) - интегрированный подход. Новая модель обработки запроса - упорядоченный список модулей, как native, так и managed.

  • Все типы файлов могу использовать возможности, доступные до этого лишь managed-коду.
  • Убирается избыточность и дублирование - одно и то же делалось в IIS, затем в ASP.NET
  • Настройка и управление модулями в одном месте, больше нет различия между IIS- и ASP.NET-конфигурацией.

6. IIS 7 Application Pools. Application pool'ы изолируют приложения друг от друга границами процесса (разные пулы приложений в разных процессах), чтобы приложения с разных пулов не влияли друг на друга (безопасность и т.п.). IIS 7 поддерживает режим изоляции с IIS'а 6. Кроме того, есть возможность включить Integrated mode (или использовать классический режим)

  • Integrated application pool mode - запрос проходит по конвейеру, в котором native- и managed-модули
  • Classic application pool mode - сначала процесс обрабатывается native-модулями (IIS), затем managed (asp.net).

Последовательность обработки HTTP-запроса в IIS 7

1. Посланный браузером запрос перехватывается драйвером http.sys

2. http.sys запрашивает у WAS информацию о конфигурации

3. WAS считывает конфигурационную информацию из applicationHost.config

4. WWW Service получает конфигурационную информацию (настройки сайта и application pool)

5. WWW Service конфигурирует http.sys

6. WAS запускает рабочий процесс для application pool (который необходим для обработки запроса)

7. Рабочий процесс обрабатывает запрос и передаёт ответ http.sys

8. http.sys шлёт ответ пользователю.

Никита МАНЬКО,
DjComandos@gmail.com


Ссылки по теме:

  1. technet.microsoft.com/en-us/library/cc772774(WS.10).aspx
  2. www.codeproject.com/KB/aspnet/aspnetrequestarchitecture.aspx
  3. www.dotnetfunda.com/articles/article821-beginners-guide-how-iis-process-aspnet-request-.aspx
  4. www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp
  5. learn.iis.net/page.aspx/101/introduction-to-iis-7-architecture/
Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Спасибо за статью, но она вводит в заблуждение. В названии есть ASP.NET, а по тексту описана активация WCF через WAS из IIS7. У меня складывается впечатление, что автор считает, что ASP.NET, ASP.NET MVC, ASP.NET Web API работают тоже через WAS, однако это не так. Установка IIS7 не требует установки WAS. Достаточно открыть окно с доп. компонентами Windows, чтобы это проверить. WAS - это не часть IIS7. WCF можно активировать и из консоли без IIS, но через WAS. Сам же ASP.NET работает либо через aspnet_isapi.dll (классический режим), либо через System.Web.UI.PageHandlerFactory (интегрированный режим). Это видно, если открыть окно настроек IIS7.

Аватар пользователя savely

Ну, не прошло и полгода :))