IIS 5 и 6 работают по-разному.
Когда приходит запрос, IIS проверяет карту сценариев (карту расширений) и направляет запрос в aspnet_isapi.dll. Работа этой DLL и то, как запросы поступают в среду выполнения ASP.NET, различаются в IIS5 и 6. На рисунке 2 показан приблизительный обзор этого процесса.
В IIS5 aspnet_isapi.dll размещается непосредственно в процессе inetinfo.exe. Если вы установите уровень изоляции веб-сайта или виртуального каталога на средний или высокий, он будет размещен в отдельном (изолированном) рабочем процессе IIS. Когда поступает первый запрос ASP.NET, DLL (aspnet_isapi.dll) запускает другой новый процесс aspnet_wp.exe и направляет запрос этому процессу для обработки. Этот процесс, в свою очередь, загружает и размещает среду выполнения .NET. Каждый запрос, пересылаемый в ISAPI DLL, направляется в этот процесс через вызов именованного канала.
Рис. 2. Высокоуровневое представление потока запросов от IIS к среде выполнения ASP.NET и через конвейер обработки запросов. IIS5 и IIS6 взаимодействуют с ASP.NET по-разному, но как только запрос поступает в конвейер ASP.NET, весь процесс обработки остается тем же.
В отличие от предыдущих версий сервера, IIS6 полностью оптимизирован для ASP.NET.
IIS6 — да здравствует пул приложений!
IIS6 вносит существенные изменения в модель обработки. IIS больше не размещает напрямую внешний исполняемый код, например расширения ISAPI. IIS всегда создает отдельный рабочий поток — пул приложений — и вся обработка происходит в этом процессе, включая выполнение ISAPI dll. Объединение приложений в пулы — это большое улучшение в IIS6, поскольку оно позволяет очень детально контролировать, какой код будет выполняться в данном потоке. Пулы приложений можно настроить на каждом виртуальном пути или на всем веб-сайте, что позволяет изолировать каждое веб-приложение в отдельный процесс, чтобы каждое приложение было подключено к другим веб-приложениям, работающим на том же компьютере. Приложения полностью изолированы. Если один процесс выйдет из строя, это не повлияет на другие процессы (по крайней мере, с точки зрения веб-обработки).
Мало того, пулы приложений легко настраиваются. Вы можете настроить среду безопасности, в которой работают пулы, установив уровень олицетворения их выполнения, что позволяет настраивать разрешения, предоставляемые веб-приложению (опять же, с очень высокой степенью детализации). Большим улучшением для ASP.NET является то, что пул приложений переопределяет большинство настроек в разделе ProcessModel файла Machine.config. Параметры в этом разделе очень сложно управлять в IIS5, поскольку эти параметры являются глобальными и не могут быть переопределены в файле web.config приложения. При запуске IIS6 параметры, связанные с ProcessModel, в основном игнорируются и вместо этого считываются из пула приложений. Обратите внимание, что большинство из них упомянуто здесь — некоторые настройки, такие как размер пула потоков и настройки потока ввода-вывода, по-прежнему считываются из Machine.config, поскольку им нет соответствующих пунктов в настройках пула потоков.
Поскольку пулы приложений являются внешними исполняемыми файлами, эти исполняемые файлы можно легко отслеживать и управлять ими. IIS6 предоставляет ряд проверок состояния системы, перезапусков и параметров тайм-аута, которые во многих случаях можно легко использовать для проверки и даже устранения проблем в программе. Наконец, пул приложений IIS6 не использует COM+, как режим изоляции IIS5. Это может повысить производительность и стабильность (особенно для некоторых внутренних приложений, которым необходимо вызывать компоненты COM).
Хотя пулы приложений IIS6 представляют собой отдельные EXE-файлы, они все же являются отдельными EXE-файлами. высоко оптимизированы для операций HTTP. Они напрямую взаимодействуют с драйвером HTTP.SYS режима ядра. Полученные запросы направляются непосредственно в соответствующий пул приложений. InetInfo — это, по сути, просто гипервизор и сервер конфигурации — большая часть взаимодействия фактически происходит непосредственно между HTTP.SYS и пулом приложений, что делает IIS6 более стабильной и эффективной средой, чем IIS5. Это особенно актуально для статического контента и приложений ASP.NET.
Пул приложений IIS6 обладает встроенным пониманием ASP.NET. ASP.NET может взаимодействовать с ним через базовый API. Это обеспечивает прямой доступ к API-интерфейсу кэширования HTTP. Это позволяет доставлять кэширование уровня ASP.NET непосредственно на веб-сервер.
В IIS6 расширения ISAPI выполняются в рабочем процессе пула приложений. Среда выполнения .NET также выполняется в том же процессе, поэтому связь между расширением ISAPI и средой выполнения .NET происходит внутри процесса. Это имеет естественное преимущество в производительности по сравнению с именованным каналом, используемым IIS5. Хотя модель хостинга IIS сильно отличается, интерфейс управляемого кода на удивление похож — немного отличается только процесс маршрутизации сообщений.