Поделиться через


Kestrel: изменения конфигурации во время выполнения, обнаруженные по умолчанию

Kestrel теперь реагирует на изменения, внесенные в раздел Kestrel экземпляра IConfiguration проекта (например, appsettings.json) во время выполнения. Дополнительные сведения о настройке Kestrel с помощью appsettings.json см. в примере appsettings.json в конфигурации конечной точки.

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

Обсуждение этого вопроса см. на странице dotnet/aspnetcore#22807.

Представленные версии

5.0 (предварительная версия 7)

Старое поведение

До ASP.NET Core 5.0 (предварительная версия 6) Kestrel не поддерживал изменение конфигурации во время выполнения.

В ASP.NET Core 5.0 (предварительная версия 6) можно выбрать поведение по умолчанию для реагирования на изменения конфигурации во время выполнения. Включение в конфигурацию требуемой привязки Kestrel вручную:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

public class Program
{
    public static void Main(string[] args) =>
        CreateHostBuilder(args).Build().Run();

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseKestrel((builderContext, kestrelOptions) =>
                {
                    kestrelOptions.Configure(
                        builderContext.Configuration.GetSection("Kestrel"), reloadOnChange: true);
                });

                webBuilder.UseStartup<Startup>();
            });
}

Новое поведение

По умолчанию Kestrel реагирует на изменения конфигурации во время выполнения. Для поддержки этого изменения ConfigureWebHostDefaults по умолчанию вызывает KestrelServerOptions.Configure(IConfiguration, bool) с reloadOnChange: true.

Причина изменения

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

  • В большинстве сценариев, в которых раздел конфигурации Kestrel по умолчанию не изменяется во время выполнения, это изменение не оказывает влияния и никаких действий не требуется.

  • Для сценариев, в которых раздел конфигурации Kestrel по умолчанию изменяется во время выполнения и Kestrel должен реагировать на него, это поведение по умолчанию.

  • Для сценариев, в которых раздел конфигурации Kestrel по умолчанию изменяется во время выполнения и Kestrel не должен реагировать на него, можно отказаться от приведенных ниже действий.

    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Hosting;
    
    public class Program
    {
        public static void Main(string[] args) =>
            CreateHostBuilder(args).Build().Run();
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseKestrel((builderContext, kestrelOptions) =>
                    {
                        kestrelOptions.Configure(
                            builderContext.Configuration.GetSection("Kestrel"), reloadOnChange: false);
                    });
    
                    webBuilder.UseStartup<Startup>();
                });
    }
    

Примечания:

Это изменение не изменяет поведение перегрузки KestrelServerOptions.Configure(IConfiguration), которое по умолчанию по-прежнему reloadOnChange: false.

Также важно убедиться, что источник конфигурации поддерживает перезагрузку. Для источников JSON перезагрузка настраивается путем вызова AddJsonFile(path, reloadOnChange: true). Для appsettings.json и appsettings.{Environment}.json повторная загрузка уже настроена по умолчанию.

Затронутые API

GenericHostBuilderExtensions.ConfigureWebHostDefaults