Kestrel:默认情况下检测到运行时的配置更改

Kestrel 现在对项目实例的部分(例如 appsettings.json)在运行时所做的更改做出反应。 若要详细了解如何使用 appsettings.json 配置 Kestrel,请参阅终结点配置中的 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