Kestrel: Konfigurationsänderungen zur Laufzeit werden standardmäßig erkannt

Kestrel reagiert nun auf Änderungen, die zur Laufzeit am Kestrel-Abschnitt der IConfiguration-Instanz des Projekts (z. B. appsettings.json) vorgenommen wurden. Weitere Informationen zum Konfigurieren von Kestrel mithilfe von appsettings.json finden Sie im appsettings.json-Beispiel unter Endpunktkonfiguration.

Nach Bedarf bindet Kestrel Endpunkte, hebt die Bindung auf und bindet sie erneut, um auf diese Konfigurationsänderungen zu reagieren.

Weitere Informationen finden Sie unter dem Issue dotnet/aspnetcore#22807.

Eingeführt in Version

5.0 Preview 7

Altes Verhalten

Vor ASP.NET Core 5.0 Preview 6 hat Kestrel das Ändern der Konfiguration zur Laufzeit nicht unterstützt.

In ASP.NET Core 5.0 Preview 6 konnten Sie das jetzige Standardverhalten zur Reaktion auf Konfigurationsänderungen zur Laufzeit aktivieren. Zum Aktivieren mussten Sie die Kestrel-Konfiguration manuell binden.

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

Neues Verhalten

Kestrel reagiert standardmäßig auf Konfigurationsänderungen zur Laufzeit. Zum Unterstützen dieser Änderung wird KestrelServerOptions.Configure(IConfiguration, bool) von ConfigureWebHostDefaults standardmäßig mit reloadOnChange: true aufgerufen.

Grund für die Änderung

Durch die Änderung sollte die erneute Endpunktkonfiguration zur Laufzeit unterstützt werden, ohne den Server vollständig neu starten zu müssen. Anders als bei einem vollständigen Serverneustart wird die Bindung für unveränderte Endpunkte nicht einmal temporär aufgehoben.

  • Bei den meisten Szenarios, bei denen der Standardkonfigurationsabschnitt von Kestrel nicht zur Laufzeit geändert wird, hat diese Änderung keine Auswirkung, und es ist keine Aktion erforderlich.

  • Bei Szenarios, bei denen der Standardkonfigurationsabschnitt von Kestrel zur Laufzeit geändert wird und Kestrel darauf reagieren sollte, ist dies nun das Standardverhalten.

  • Bei Szenarios, bei denen der Standardkonfigurationsabschnitt von Kestrel zur Laufzeit geändert wird und Kestrel nicht darauf reagieren sollte, können Sie dieses Verhalten wie folgt deaktivieren:

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

Hinweise:

Durch diese Änderung wird nicht das Verhalten des Überladens von KestrelServerOptions.Configure(IConfiguration) geändert. Hierfür gilt weiterhin das Standardverhalten reloadOnChange: false.

Es ist zudem wichtig, sicherzustellen, dass die Konfigurationsquelle das erneute Laden unterstützt. Bei JSON-Quellen wird das erneute Laden konfiguriert, indem AddJsonFile(path, reloadOnChange: true) aufgerufen wird. Bei appsettings.json und appsettings.{Umgebung}.json ist das erneute Laden standardmäßig bereits konfiguriert.

Betroffene APIs

GenericHostBuilderExtensions.ConfigureWebHostDefaults