Реализации веб-сервера в ASP.NET Core
Приложение ASP.NET Core выполняется вместе с внутрипроцессной реализацией HTTP-сервера. Реализация сервера прослушивает HTTP-запросы и передает их в приложение как набор функций запросов, объединенных в HttpContext.
В состав ASP.NET Core входит следующее:
- Kestrel сервер представляет собой кроссплатформенную реализацию HTTP-сервера по умолчанию. Kestrel обеспечивает максимальную производительность и использование памяти, но обладает некоторыми дополнительными функциями в HTTP.sys. Для получения дополнительной информации см. Раздел Kestrel и HTTP.sys в следующем разделе.
- HTTP-сервер IIS — это внутрипроцессный сервер для службы IIS.
- Сервер HTTP.sys — это HTTP-сервер, предназначенный только для Windows и основанный на драйвере ядра HTTP.sys и API HTTP-сервера.
При использовании IIS или IIS Express приложение запускается одним из следующих способов:
- В том же процессе, что и рабочий процесс IIS (модель внутрипроцессного размещения), с использованием HTTP-сервера IIS. Внутрипроцессное размещение является рекомендуемой конфигурацией.
- В процессе, отдельном от рабочего процесса IIS (внепроцессная модель хостинга) с Kestrel сервером.
Модуль ASP.NET Core представляет собой собственный модуль IIS, который обрабатывает собственные запросы IIS между IIS и внутрипроцессным HTTP-сервером IIS или Kestrel. Дополнительные сведения см. в разделе Модуль ASP.NET Core для IIS.
Kestrel в сравнении с HTTP.sys
Kestrel имеет следующие преимущества перед HTTP.sys:
- Повышенная производительность и более эффективное использование памяти.
- Кроссплатформенные
- Гибкость, поскольку разработка и установка исправлений осуществляется независимо от операционной системы.
- Программный порт и конфигурация TLS.
- Расширяемость, обеспечивающая использование таких протоколов, как PPv2, и альтернативные транспорты.
HTTP.sys выступает в качестве общего компонента режима ядра со следующими функциями, которыми не обладает Kestrel:
- Совместное использование портов
- Проверка подлинности Windows в режиме ядра. Kestrel поддерживает аутентификацию только в пользовательском режиме.
- Быстрое проксирование с помощью передачи очередей
- Прямая передача файлов
- Кэширование откликов
Модели размещения
При внутрипроцессном размещении приложение ASP.NET Core выполняется в том же процессе, что и рабочий процесс IIS. При этом повышается производительность по сравнению с внепроцессным размещением, так как запросы не передаются через адаптер замыкания на себя (сетевой интерфейс, который возвращает исходящий сетевой трафик на тот же компьютер). IIS обрабатывает управление процессом с помощью службы активации процессов Windows (WAS).
При внепроцессном размещении приложения ASP.NET Core выполняются в процессе, отделенном от рабочего процесса IIS, а модуль управляет процессами. Модуль запускает процесс для приложения ASP.NET Core при поступлении первого запроса и перезапускает приложение при сбое или завершении работы. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS). Использование отдельного процесса также позволяет размещать более одного приложения из одного пула приложений.
Дополнительные сведения и инструкции по настройке см. в следующих статьях:
ASP.NET Core поставляется с Kestrel сервером, который является межплатформенным HTTP-сервером по умолчанию.
ASP.NET Core поставляется с Kestrel сервером, который является межплатформенным HTTP-сервером по умолчанию.
Kestrel
Kestrel сервер представляет собой кроссплатформенную реализацию HTTP-сервера по умолчанию. Kestrel обеспечивает максимальную производительность и использование памяти, но обладает некоторыми дополнительными функциями в HTTP.sys. Дополнительные сведения см. в разделе Kestrel и HTTP.sys настоящего документа.
Используйте Kestrel в следующих случаях:
- Сам по себе как пограничный сервер обработки запросов непосредственно из сети, включая Интернет.
- С обратным прокси-сервером, таким как службы IIS, Nginx или Apache. Обратный прокси-сервер получает HTTP-запросы из Интернета и пересылает их на Kestrel.
Поддерживается любая из этих конфигураций размещения (с обратным прокси-сервером и без него).
Инструкции по настройке Kestrel и информацию о том, когда следует использовать Kestrel в конфигурации обратного прокси, см. в статье Реализация веб-сервера Kestrel в ASP.NET Core.
В состав ASP.NET Core входит следующее:
- Kestrel сервер представляет собой кроссплатформенный HTTP-сервер по умолчанию.
- Сервер HTTP.sys — это HTTP-сервер, предназначенный только для Windows и основанный на драйвере ядра HTTP.sys и API HTTP-сервера.
При использовании IIS или IIS Express приложение запускается в процессе, отдельном от рабочего процесса IIS (внепроцессный) с Kestrel сервера.
Так как приложения ASP.NET Core выполняются в процессе, отделенном от рабочего процесса IIS, этот модуль обрабатывает управление процессами. Модуль запускает процесс для приложения ASP.NET Core при поступлении первого запроса и перезапускает приложение при сбое или завершении работы. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS).
На следующей схеме показана связь между IIS, модулем ASP.NET Core и приложением, размещенным вне процесса.
Запросы поступают из Интернета в драйвер HTTP.sys в режиме ядра. Драйвер направляет запросы к службам IIS на настроенный порт веб-сайта — обычно 80 (HTTP) или 443 (HTTPS). Модуль перенаправляет запросы в Kestrel на случайный порт для приложения, который не является портом 80 или 443.
Модуль задает порт с помощью переменной среды во время запуска, а ПО промежуточного слоя для интеграции IIS настраивает сервер для прослушивания http://localhost: . Выполняются дополнительные проверки, и запросы не из модуля отклоняются. Модуль не поддерживает переадресацию по HTTPS, поэтому запросы переадресовываются по протоколу HTTP, даже если были получены IIS по протоколу HTTPS.
После того, как Kestrel получает запрос от модуля, запрос передается в конвейер промежуточного программного обеспечения ASP.NET Core. Конвейер ПО промежуточного слоя обрабатывает запрос и передает его в качестве экземпляра HttpContext в логику приложения. ПО промежуточного слоя, добавленное посредством интеграции IIS, обновляет схему, удаленный IP-адрес и базу путей с учетом пересылки запроса на Kestrel. Отклик приложения передается обратно в службу IIS, которая отправляет его обратно в HTTP-клиент, инициировавший запрос.
Инструкции по настройке модуля ASP.NET Core и IIS см. в следующих статьях:
ASP.NET Core поставляется с Kestrel сервером, который является межплатформенным HTTP-сервером по умолчанию.
ASP.NET Core поставляется с Kestrel сервером, который является межплатформенным HTTP-сервером по умолчанию.
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 можно также использовать для приложений, которые имеют доступ только к внутренней сети.
Инфраструктура сервера 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 Debugger.
При запуске приложения из командной строки в папке проекта dotnet run запускает приложение и сервер (только Kestrel и HTTP.sys). Конфигурация определяется параметром -c|—configuration , который может принимать значение Debug (по умолчанию) или Release .
Файл launchSettings.json предоставляет конфигурацию при запуске приложения с помощью dotnet run или с помощью отладчика, встроенного в инструментарий, например Visual Studio. Если профили запуска указаны в файле launchSettings.json , используйте параметр —launch-profile с командой 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 или более поздней версии).
- HTTP/2 будет поддерживаться для macOS в будущих выпусках.
- Windows Server 2016 / Windows 10 или более поздних версий
- Целевая платформа: неприменимо к развертываниям HTTP.sys.
- Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
- Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
- Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
- Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
- Целевая платформа: неприменимо к внепроцессным развертываниям 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 в будущих выпусках.
- Windows Server 2016 / Windows 10 или более поздних версий
- Целевая платформа: неприменимо к развертываниям HTTP.sys.
- Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
- Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
- Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
- Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
- Целевая платформа: неприменимо к внепроцессным развертываниям IIS.
†Kestrel имеет ограниченную поддержку HTTP/2 в Windows Server 2012 R2 и Windows 8.1. Поддержка ограничена из-за небольшого числа поддерживаемых комплектов шифров TLS, доступных для этих операционных систем. Для обеспечения безопасности TLS-подключений может потребоваться сертификат, созданный с использованием алгоритма ECDSA.
- HTTP.sys
- Windows Server 2016 / Windows 10 или более поздних версий
- Целевая платформа: неприменимо к развертываниям HTTP.sys.
- Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
- Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
- Целевая платформа: неприменимо к внепроцессным развертываниям IIS.
Подключение HTTP/2 должно использовать согласование протокола уровня приложений (ALPN) и TLS 1.2 или более поздней версии. Дополнительные сведения см. в разделах, о конкретных сценариях развертывания сервера.
Дополнительные ресурсы
- Операционная система
- Операционная система