Реализации веб-сервера в ASP.NET Core

Авторы: Том Дисктра (Tom Dykstra), Стив Смит (Steve Smith), Стивен Хальтер (Stephen Halter) и Крис Росс (Chris Ross)

Приложение ASP.NET Core выполняется вместе с внутрипроцессной реализацией HTTP-сервера. Реализация сервера прослушивает HTTP-запросы и передает их в приложение как набор функций запросов, объединенных в HttpContext.

В состав ASP.NET Core входит следующее:

При использовании IIS или IIS Express приложение запускается одним из следующих способов:

Модуль ASP.NET Core представляет собой собственный модуль IIS, который обрабатывает собственные запросы IIS между IIS и внутрипроцессным HTTP-сервером IIS или Kestrel. Дополнительные сведения см. в разделе Модуль ASP.NET Core для IIS.

Kestrel в сравнении с HTTP.sys

Kestrel имеет следующие преимущества перед HTTP.sys:

  • Повышенная производительность и более эффективное использование памяти.
  • Кроссплатформенные
  • Гибкость, поскольку разработка и установка исправлений осуществляется независимо от операционной системы.
  • Программный порт и конфигурация TLS.
  • Расширяемость, обеспечивающая использование таких протоколов, как PPv2, и альтернативные транспорты.

HTTP.sys выступает в качестве общего компонента режима ядра со следующими функциями, которыми не обладает Kestrel:

Модели размещения

Доступны несколько моделей размещения:

  • Kestrel самостоятельное размещение: Kestrel веб-сервер выполняется без каких-либо других внешних веб-серверов, таких как IIS или HTTP.sys.

  • Самостоятельное размещение HTTP.sys является альтернативой Kestrel. Kestrel рекомендуется для HTTP.sys, если приложению не требуются функции, недоступные в Kestrel.

  • Размещение в процессе IIS: приложение ASP.NET Core выполняется в том же процессе, что и рабочий процесс IIS. Размещение в процессе IIS обеспечивает улучшенную производительность по сравнению с размещением внепроцессных служб IIS, так как запросы не обрабатываются через адаптер петли, сетевой интерфейс, который возвращает исходящий сетевой трафик обратно на тот же компьютер. IIS обрабатывает управление процессом с помощью службы активации процессов Windows (WAS).

  • Размещение внепроцессных служб IIS: ASP.NET основные приложения выполняются в процессе, отдельном от рабочего процесса IIS, а модуль обрабатывает управление процессами. Модуль запускает процесс для приложения ASP.NET Core при поступлении первого запроса и перезапускает приложение при сбое или завершении работы. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS). Использование отдельного процесса также позволяет размещать более одного приложения из одного пула приложений.

Дополнительные сведения см. в следующих разделах:

Kestrel

Kestrel сервер представляет собой кроссплатформенную реализацию HTTP-сервера по умолчанию. Kestrel обеспечивает максимальную производительность и использование памяти, но обладает некоторыми дополнительными функциями в HTTP.sys. Дополнительные сведения см. в разделе Kestrel и HTTP.sys настоящего документа.

Используйте Kestrel в следующих случаях:

  • Сам по себе как пограничный сервер обработки запросов непосредственно из сети, включая Интернет.

    Kestrel communicates directly with the Internet without a reverse proxy server

  • С обратным прокси-сервером, таким как службы IIS, Nginx или Apache. Обратный прокси-сервер получает HTTP-запросы из Интернета и пересылает их на Kestrel.

    Kestrel communicates indirectly with the Internet through a reverse proxy server, such as IIS, Nginx, or Apache

Поддерживается любая из этих конфигураций размещения (с обратным прокси-сервером и без него).

Рекомендации Kestrel по настройке и сведения о том, когда следует использовать Kestrel в конфигурации обратного прокси-сервера, см Kestrel . в ASP.NET Core.

В состав ASP.NET Core входит следующее:

При использовании IIS или IIS Express приложение запускается в процессе, отдельном от рабочего процесса IIS (внепроцессный) с Kestrel сервер .

Так как приложения ASP.NET Core выполняются в процессе, отделенном от рабочего процесса IIS, этот модуль обрабатывает управление процессами. Модуль запускает процесс для приложения ASP.NET Core при поступлении первого запроса и перезапускает приложение при сбое или завершении работы. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS).

На следующей схеме показана связь между IIS, модулем ASP.NET Core и приложением, размещенным вне процесса.

ASP.NET Core Module

Запросы поступают из Интернета в драйвер HTTP.sys в режиме ядра. Драйвер направляет запросы к службам IIS на настроенный порт веб-сайта — обычно 80 (HTTP) или 443 (HTTPS). Модуль перенаправляет запросы к Kestrel на случайный порт для приложения, который не является портом 80 или 443.

Модуль задает порт с помощью переменной среды во время запуска, а ПО промежуточного слоя для интеграции IIS настраивает сервер для прослушивания http://localhost:{port}. Выполняются дополнительные проверки, и запросы не из модуля отклоняются. Модуль не поддерживает переадресацию по HTTPS, поэтому запросы переадресовываются по протоколу HTTP, даже если были получены IIS по протоколу HTTPS.

После того, как Kestrel получает запрос от модуля, запрос передается в конвейер ПО промежуточного слоя ASP.NET Core. Конвейер ПО промежуточного слоя обрабатывает запрос и передает его в качестве экземпляра HttpContext в логику приложения. ПО промежуточного слоя, добавленное с использованием интеграции IIS, обновляет схему, удаленный IP-адрес и базовый путь с учетом перенаправления запроса к Kestrel. Отклик приложения передается обратно в службу IIS, которая отправляет его обратно в HTTP-клиент, инициировавший запрос.

Инструкции по настройке модуля ASP.NET Core и IIS см. в следующих статьях:

Nginx с Kestrel

Сведения о том, как использовать Nginx в Linux в качестве обратного прокси-сервера для Kestrel, см. в статье Размещение ASP.NET Core в Linux с использованием Nginx.

Apache с Kestrel

Сведения о том, как использовать Apache в Linux в качестве обратного прокси-сервера для Kestrel, см. в статье Размещение ASP.NET Core в Linux с использованием Apache.

HTTP.sys

Если приложения ASP.NET Core запускаются в Windows, HTTP.sys является альтернативой Kestrel. Kestrel рекомендуется для HTTP.sys, если приложению не требуются функции, недоступные в Kestrel. Дополнительные сведения см. в статье Реализация веб-сервера HTTP.sys в ASP.NET Core.

HTTP.sys communicates directly with the Internet

HTTP.sys можно также использовать для приложений, которые имеют доступ только к внутренней сети.

HTTP.sys communicates directly with the internal network

Руководство по настройке HTTP.sys см. в статье Реализация веб-сервера HTTP.sys в ASP.NET Core.

Инфраструктура сервера ASP.NET Core

IApplicationBuilder, доступный в методе Startup.Configure, предоставляет свойство ServerFeatures типа IFeatureCollection. Kestrel и HTTP.sys предоставляют только одну функцию каждый, IServerAddressesFeature, однако разные реализации сервера могут предоставлять дополнительные функции.

IServerAddressesFeature можно использовать для того, чтобы узнать, какой порт в реализации сервера привязан к среде выполнения.

Пользовательские серверы

Если встроенные серверы не отвечают требованиям приложения, можно создать реализацию пользовательского сервера. В руководстве по открытому веб-интерфейсу .NET (OWIN) демонстрируется запись реализации IServer на основе Nowin. Требуют реализации только интерфейсы компонентов, используемых приложением, но как минимум должны поддерживаться IHttpRequestFeature и IHttpResponseFeature.

Запуск сервера

Сервер запускается, когда интегрированная среда разработки (IDE) или редактор запускает приложение:

  • Visual Studio — профили запуска можно использовать для запуска приложения и сервера с помощью IIS Express/модуля ASP.NET Core или консоли.
  • Visual Studio Code: приложение и сервер запускаются Omnisharp, который активирует отладчик CoreCLR.
  • Visual Studio для Mac. Приложение и сервер запускаются отладчиком Mono Soft-Mode.

При запуске приложения из командной строки в папке проекта dotnet run запускает приложение и сервер (только Kestrel и HTTP.sys). Конфигурация определяется параметром -c|--configuration, который может принимать значение Debug (по умолчанию) или Release.

Файл launchSettings.json предоставляет конфигурацию при запуске приложения с помощью dotnet run или с помощью отладчика, встроенного в инструментарий, например Visual Studio. Если профили запуска присутствуют в launchSettings.json файле, используйте --launch-profile {PROFILE NAME} параметр с dotnet run командой или выберите профиль в Visual Studio. Дополнительные сведения см. в статьях dotnet run и Упаковка дистрибутивов .NET Core.

Поддержка HTTP/2

HTTP/2 поддерживается в ASP.NET Core для следующих сценариев развертывания:

  • Kestrel
    • Операционная система
      • Windows Server 2016 / Windows 10 или более поздних версий†
      • Linux с OpenSSL 1.0.2 или более поздней версии (например, Ubuntu 16.04 или более поздней версии)
      • macOS 10.15 или более поздней версии
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • HTTP.sys
    • Windows Server 2016 / Windows 10 или более поздних версий
    • Требуемая версия .NET Framework: не применимо к развертываниям HTTP.sys.
  • IIS (внутрипроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • IIS (внепроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
    • Требуемая версия .NET Framework: не применимо к внепроцессным развертываниям IIS.

†Kestrel имеет ограниченную поддержку HTTP/2 в Windows Server 2012 R2 и Windows 8.1. Поддержка ограничена из-за небольшого числа поддерживаемых комплектов шифров TLS, доступных для этих операционных систем. Для обеспечения безопасности TLS-подключений может потребоваться сертификат, созданный с использованием алгоритма ECDSA.

  • Kestrel
    • Операционная система
      • Windows Server 2016 / Windows 10 или более поздних версий†
      • Linux с OpenSSL 1.0.2 или более поздней версии (например, Ubuntu 16.04 или более поздней версии)
      • HTTP/2 будет поддерживаться для macOS в будущих выпусках.
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • HTTP.sys
    • Windows Server 2016 / Windows 10 или более поздних версий
    • Требуемая версия .NET Framework: не применимо к развертываниям HTTP.sys.
  • IIS (внутрипроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • IIS (внепроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
    • Требуемая версия .NET Framework: не применимо к внепроцессным развертываниям IIS.

†Kestrel имеет ограниченную поддержку HTTP/2 в Windows Server 2012 R2 и Windows 8.1. Поддержка ограничена из-за небольшого числа поддерживаемых комплектов шифров TLS, доступных для этих операционных систем. Для обеспечения безопасности TLS-подключений может потребоваться сертификат, созданный с использованием алгоритма ECDSA.

  • Kestrel
    • Операционная система
      • Windows Server 2016 / Windows 10 или более поздних версий†
      • Linux с OpenSSL 1.0.2 или более поздней версии (например, Ubuntu 16.04 или более поздней версии)
      • HTTP/2 будет поддерживаться для macOS в будущих выпусках.
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • HTTP.sys
    • Windows Server 2016 / Windows 10 или более поздних версий
    • Требуемая версия .NET Framework: не применимо к развертываниям HTTP.sys.
  • IIS (внутрипроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • IIS (внепроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
    • Требуемая версия .NET Framework: не применимо к внепроцессным развертываниям IIS.

†Kestrel имеет ограниченную поддержку HTTP/2 в Windows Server 2012 R2 и Windows 8.1. Поддержка ограничена из-за небольшого числа поддерживаемых комплектов шифров TLS, доступных для этих операционных систем. Для обеспечения безопасности TLS-подключений может потребоваться сертификат, созданный с использованием алгоритма ECDSA.

  • HTTP.sys
    • Windows Server 2016 / Windows 10 или более поздних версий
    • Требуемая версия .NET Framework: не применимо к развертываниям HTTP.sys.
  • IIS (внепроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
    • Требуемая версия .NET Framework: не применимо к внепроцессным развертываниям IIS.

Подключение HTTP/2 должно использовать согласование протокола уровня приложений (ALPN) и TLS 1.2 или более поздней версии. Дополнительные сведения см. в разделах, о конкретных сценариях развертывания сервера.

Дополнительные ресурсы