Compartir a través de


Kestrel: cambios de configuración en tiempo de ejecución detectados de forma predeterminada

Kestrel ahora reacciona a los cambios realizados en la sección Kestrel de la instancia IConfiguration del proyecto (por ejemplo, appsettings.json) en tiempo de ejecución. Para obtener más información sobre cómo configurar Kestrel mediante appsettings.json, vea el ejemplo appsettings.json en Configuración de puntos de conexión.

Kestrel enlaza, desenlaza y vuelve a enlazar los puntos de conexión según sea necesario para reaccionar a estos cambios de configuración.

Para obtener información, vea el tema dotnet/aspnetcore#22807.

Versión introducida

5.0 (versión preliminar 7)

Comportamiento anterior

Antes de ASP.NET Core 5.0 (versión preliminar 6), Kestrel no admitía los cambios de configuración en tiempo de ejecución.

En ASP.NET Core 5.0 (versión preliminar 6), podía optar por el actual comportamiento predeterminado de reaccionar a los cambios de configuración en tiempo de ejecución. Esto exigía enlazar la configuración de Kestrel manualmente:

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

Comportamiento nuevo

Kestrel reacciona a los cambios de configuración en tiempo de ejecución de forma predeterminada. Para admitir ese cambio, ConfigureWebHostDefaults llama a KestrelServerOptions.Configure(IConfiguration, bool) con reloadOnChange: true de forma predeterminada.

Motivo del cambio

El cambio se ha realizado para admitir la reconfiguración de puntos de conexión en tiempo de ejecución sin reiniciar completamente el servidor. A diferencia de un reinicio completo del servidor, los puntos de conexión sin cambios no se desenlazan ni de forma temporal.

  • En la mayoría de los escenarios en los que la sección de configuración predeterminada de Kestrel no cambia en tiempo de ejecución, este cambio no tiene ningún impacto ni se requiere ninguna acción.

  • En los escenarios en los que la sección de configuración predeterminada de Kestrel cambia en tiempo de ejecución y Kestrel debe reaccionar, este es ahora el comportamiento predeterminado.

  • En los escenarios en los que la sección de configuración predeterminada de Kestrel cambia en tiempo de ejecución y Kestrel no debe reaccionar, puede optar por no participar de este modo:

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

Notas:

Este cambio no modifica el comportamiento de la sobrecarga KestrelServerOptions.Configure(IConfiguration), que sigue teniendo como valor predeterminado el comportamiento reloadOnChange: false.

También es importante asegurarse de que el origen de configuración admite la recarga. En los orígenes JSON, la recarga se configura al llamar a AddJsonFile(path, reloadOnChange: true). La recarga ya está configurada de forma predeterminada para appsettings.json y appsettings.{Environment}.json.

API afectadas

GenericHostBuilderExtensions.ConfigureWebHostDefaults