Kestrel: modifiche alla configurazione in fase di esecuzione rilevate per impostazione predefinita

Kestrel ora reagisce alle modifiche apportate alla sezione Kestrel dell'istanza IConfiguration del progetto (ad esempio, appsettings.json) in fase di esecuzione. Per altre informazioni su come configurare Kestrel usando appsettings.json, vedere l'esempio di appsettings.json in Configurazione endpoint.

Kestrel associa, annulla e associerà nuovamente gli endpoint in base alle necessità per reagire a queste modifiche di configurazione.

Per informazioni, vedere il problema dotnet/aspnetcore#22807.

Versione introdotta

5.0 Anteprima 7

Comportamento precedente

Prima di ASP.NET Core 5.0 Anteprima 6, Kestrel non supportava la modifica della configurazione in fase di esecuzione.

In ASP.NET Core 5.0 Anteprima 6 era possibile acconsentire esplicitamente al comportamento predefinito di reagire alle modifiche alla configurazione in fase di esecuzione. Acconsentire esplicitamente alla configurazione di Kestrel necessaria per l'associazione:

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>();
            });
}

Nuovo comportamento

Kestrel reagisce alle modifiche di configurazione in fase di esecuzione per impostazione predefinita. Per supportare tale modifica, ConfigureWebHostDefaults chiama KestrelServerOptions.Configure(IConfiguration, bool) con reloadOnChange: true per impostazione predefinita.

Motivo della modifica

La modifica è stata apportata per supportare la riconfigurazione dell'endpoint in fase di esecuzione senza riavviare completamente il server. A differenza di un riavvio completo del server, gli endpoint non modificati non vengono associati temporaneamente.

  • Per la maggior parte degli scenari in cui la sezione di configurazione predefinita di Kestrel non cambia in fase di esecuzione, tale modifica non ha alcun impatto e non è necessaria alcuna azione.

  • Per gli scenari in cui la sezione di configurazione predefinita di Kestrel cambia in fase di esecuzione e Kestrel deve reagire, questo è ora il comportamento predefinito.

  • Per gli scenari in cui la sezione di configurazione predefinita di Kestrel cambia in fase di esecuzione e Kestrel non deve reagire, è possibile rifiutare esplicitamente quanto segue:

    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>();
                });
    }
    

Note:

Questa modifica non varia il comportamento dell'overload KestrelServerOptions.Configure(IConfiguration), che per impostazione predefinita viene comunque impostato sul comportamento reloadOnChange: false.

È anche importante assicurarsi che l'origine di configurazione supporti il ricaricamento. Per le origini JSON, il ricaricamento viene configurato chiamando AddJsonFile(path, reloadOnChange: true). Il ricaricamento è già configurato per impostazione predefinita per appsettings.json e appsettings.{ Environment}.json.

API interessate

GenericHostBuilderExtensions.ConfigureWebHostDefaults