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.json 和 appsettings.{Environment}.json 均已設定重新載入。