Внепроцессное размещение в службах IIS и ASP.NET Core

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

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

ASP.NET Core Module in the out-of-process hosting scenario

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

Модуль ASP.NET Core задает порт с помощью переменной среды при запуске. Расширение UseIISIntegration настраивает сервер для прослушивания http://localhost:{PORT}. Выполняются дополнительные проверки, и запросы не из модуля отклоняются. Модуль не поддерживает переадресацию по HTTPS. Запросы переадресовываются по протоколу HTTP, даже если были получены IIS по протоколу HTTPS.

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

Инструкции по настройке модуля ASP.NET Core см. в статье Модуль ASP.NET Core (ANCM) для IIS.

Дополнительные сведения о размещении см. в разделе Размещение в ASP.NET Core.

Конфигурация приложений

Включение компонентов IISIntegration

При создании узла в CreateHostBuilder (Program.cs) вызов для CreateDefaultBuilder включения интеграции IIS:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        ...

Дополнительные сведения о CreateDefaultBuilder см. в статье Универсальный узел .NET в ASP.NET Core.

Модель размещения вне процесса

Чтобы настроить параметры IIS, включите конфигурацию служб для IISOptions в ConfigureServices. В следующем примере приложению запрещается заполнение HttpContext.Connection.ClientCertificate:

services.Configure<IISOptions>(options => 
{
    options.ForwardClientCertificate = false;
});
Параметр По умолчанию Параметр
AutomaticAuthentication true Если значение — true, ПО промежуточного слоя для интеграции IIS задает свойство HttpContext.User, которое прошло проверку подлинности Windows. Если значение — false, ПО промежуточного слоя только предоставляет идентификатор для HttpContext.User и отвечает на явные запросы защиты от AuthenticationScheme. Для работы AutomaticAuthentication необходимо включить в службах IIS проверку подлинности Windows. Дополнительные сведения см. в статье о проверке подлинности Windows.
AuthenticationDisplayName null Задает отображаемое имя для пользователей на страницах входа.
ForwardClientCertificate true Если значение — true и если присутствует заголовок запроса MS-ASPNETCORE-CLIENTCERT, происходит заполнение HttpContext.Connection.ClientCertificate.

Сценарии использования прокси-сервера и подсистемы балансировки нагрузки

ПО промежуточного слоя для интеграции IIS и модуль ASP.NET Core настроены для пересылки:

  • схемы (HTTP/HTTPS);
  • удаленного IP-адреса, на котором возник запрос.

ПО промежуточного слоя для интеграции IIS настраивает ПО промежуточного слоя переадресации заголовков.

Для приложений, размещенных за дополнительными прокси-серверами и подсистемами балансировки нагрузки, может потребоваться дополнительная настройка. Дополнительные сведения см. в разделе Настройка ASP.NET Core для работы с прокси-серверами и подсистемами балансировки нагрузки.

Модель размещения вне процесса

Чтобы настроить приложение для размещения вне процесса, задайте значение <AspNetCoreHostingModel> свойства OutOfProcess в файле проекта (.csproj):

<PropertyGroup>
  <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

Для внутрипроцессного размещения указано значение InProcess, которое является значением по умолчанию.

Значение <AspNetCoreHostingModel> не учитывает регистр, поэтому inprocess и outofprocess являются допустимыми значениями.

Сервер Kestrel используется вместо HTTP-сервера IIS (IISHttpServer).

При размещении вне процесса CreateDefaultBuilder вызывает UseIISIntegration в следующих целях.

  • Настройка порта и базового пути, которые будет прослушивать сервер при выполнении за модулем ASP.NET Core.
  • Настройка перехвата ошибок запуска на узле.

Имя процесса

Process.GetCurrentProcess().ProcessName сообщает w3wp/iisexpress (внутри процесса) или dotnet (вне процесса).

Многие собственные модули, такие как проверка подлинности Windows, остаются активными. Дополнительные сведения о модулях IIS, активных с модулем ASP.NET Core, см. в статье Модули IIS с ASP.NET Core.

Дополнительные возможности модуля ASP.NET Core:

  • Задание переменных среды для рабочего процесса.
  • Внесение в журнал выходных данных stdout для хранилища файлов с целью устранения неполадок при запуске.
  • Переадресация токенов проверки подлинности Windows.