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 повторная загрузка уже настроена по умолчанию.