HTTP Platform Handler или как подружить ASP.NET 5 с IIS

Вначале текущего года была представлена HTTP Platform Handler, основной целью которого была возможность хостинга веб-приложений в Microsoft Azure c использованием IIS, но без использования платформы .NET Framework. К таковым, например, относятся: Java, Node.JS, Ruby on Rails и т.п. Таким образом получается, что HttpPlatformHandler предназначена главным образом для Microsoft Azure. Формально HttpPlatformHandler – это HTTP-модуль для версий IIS 8 и выше, то есть IIS 8+. Напомню, что на данный момент их всего три: IIS8, IIS 8.5 и IIS 10. И они по сути, почти ничем друг от друга не отличаются (поддержка HTTP/2 в IIS 10 не в счет) и присутствуют в следующих версиях операционных систем: Windows 8/ Windows Server 2012, Windows 8.1/Windows Server 2012 R2 и Windows 10 соответственно. Давайте на примере свежеустановленной версии Windows 10 Version 1511 в виртуальной среде Hyper-V попробуем более детально на практике рассмотреть HttpPlatformHandler.

Запускаем веб-браузер на виртуальной машине и скачиваем установочный пакет HttpPlatformHandler v1.2 для x64.

Прежде чем произвести установку посмотрим список установленных по умолчанию модулей при помощи диспетчера IIS (IIS Manager).

После окончания установки HTTP Platform Handler

смотрим на список модулей IIS ещё раз.

Видно, что раздел неуправляемых HTTP-модулей IIS пополнился ещё одним модулем под названием httpPlatformHandler. Открываем Visual Studio 2015 и создаем приложение ASP.NET 5 (на момент написания статьи используется Visual Studio 2015 Update 1 с ASP.NET 5 RC1).

Публикуем приложение в файловой системе.

Каталоги approot и wwwroot, которые создаются при публикации приложения ASP.NET 5, копируем в стандартную директорию IIS. В данном случае каталог wwwroot заменяет собой присутствующий по умолчанию каталог wwwroot в inetpub. Напомню, что wwwroot содержит только статические файлы приложения (файлы JavaScript тоже таковыми являются), всё остальное находится в папке approot.

После копирования, или перед, нам нужно поменять настройки пула приложения, в данном случае он сам непосредственно не будет загружать никакую версию CLR, то есть будет по сути обычным процессом. Это возможно благодаря тому, что, приложения ASP.NET 5 имеют собственный процесс, в котором выполняются. До ASP.NET 4.6, как вы знаете в качестве хоста приложения выступали непосредственно процессы пулов IIS. В конце мы посмотрим на список процессов.

Нужно также убедиться, что секция обработчиков HTTP-данных разблокирована в настройках IIS, по умолчанию это так и есть.

Вот так это будет выглядеть: Lock Section (секция разблокирована, активна кнопка блокировки).

Ну и после вышеописанного останется только запустить приложение и убедиться, что всё работает.

Получается, что в настоящее время всё же, кое-что нужно выполнять вручную, но как видно всё просто. Теперь давайте запустим Process Explorer и посмотрим на список процессов, созданных для работы приложения, про которые я упомянул выше. Действительно, если посмотреть на выделенное дерево процессов, то можно увидеть, что у процесса пула w3wp.exe нет вкладок с информацией о .NET, так как CLR не загружена. Ну а в качестве нового хоста для приложения ASP.NET 5 выступает DNX.

Назревает вполне себе логичный вопрос: если всю работу, ну или почти всю на себя берёт DNХ, то зачем нам вообще процесс пула и сам IIS? Тут нужно вспомнить, что IIS это не только процесс пула W3WP, как многим кажется на первый взгляд, а целый комплекс компонент, взаимодействующих между собой, как показано в статье по ссылке. И в данном конкретном случае, часть работы по обработке запросов (прием и передача, хостинг файлов, управление и мониторинг процессов и т.п.) IIS берет на себя. Ну и наконец ниже приведен список ссылок по HTTP Platform Handler, их не много, да и информации тоже:

https://www.iis.net/learn/extensions/httpplatformhandler
https://www.hanselman.com/blog/AnnouncingRunningRubyOnRailsOnIIS8OrAnythingElseReallyWithTheNewHttpPlatformHandler.aspx
https://azure.microsoft.com/en-us/blog/announcing-the-release-of-the-httpplatformhandler-module-for-iis-8