Share via


Kestrel:預設偵測到執行時的組態變更

Kestrel 現在會回應執行時,對專案之 IConfiguration 執行個體 (例如 appsettings.json) Kestrel 區段的變更。 若要深入了解如何使用 appsettings.json 設定 Kestrel,請參閱端點設定中的 appsettings.json 範例。

Kestrel 會在需要時繫結、解除繫結和重新繫結端點,以回應這些組態變更。

若要查看相關討論,請參閱 dotnet/aspnetcore#22807 問題。

導入的版本

5.0 預覽版 7

舊的行為

在 ASP.NET Core 5.0 Preview 6 之前,Kestrel 不支援在執行時變更組態。

在 ASP.NET Core 5.0 Preview 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 預設會使用 reloadOnChange: true 呼叫 KestrelServerOptions.Configure(IConfiguration, bool)

變更原因

變更的原因在支援執行時重新設定端點,但不需要全面重新啟動伺服器。 不同於全面重新啟動伺服器,未變更的端點連暫時解除繫結都不會。

  • 對於大多數 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.jsonappsettings.{Environment}.json 均已設定重新載入。

受影響的 API

GenericHostBuilderExtensions.ConfigureWebHostDefaults