为什么 CreateDefaultBuilder 不使用 appsettings.json 值配置主机?
部分答案是区分主机和应用程序配置。文档 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-2.1#set-up-a-host说CreateDefaultBuilder
...
- Loads host configuration from:
- 以 ASPNETCORE_ ... 为前缀的环境变量
- 命令行参数。
- Loads app configuration from:
- 应用程序设置.json。
- appsettings.{环境}.json。
从内部CreateDefaultBuilder
,原因是appsettings.json
不会自动影响主机,因为这些设置正在配置应用程序,并且应用程序配置不会影响主机配置。该文档表明,当它说:
IWebHostBuilder
配置已添加到应用程序的配置中,但反之则不然 —ConfigureAppConfiguration
不影响 IWebHostBuilder 配置。
看着源代码 https://github.com/aspnet/MetaPackages/blob/67959ad853947d6ffef1916d02979753c0fd59e3/src/Microsoft.AspNetCore/WebHost.cs#L169-L170表明CreateDefaultBuilder
方法仅添加appsettings.json
其调用中的值ConfigureAppConfiguration
。这就是为什么这些值不会自动影响主机。
我们如何使用 *.json 文件中的值配置主机?
CreateDefaultBuilder
不会自动配置主机*.json
文件。我们需要手动执行此操作,并且该文档指定了如何 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-2.1#override-configuration。在示例中,文件名为hostsettings.json
,该示例明确添加它,如下所示:
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hostsettings.json")
.Build();
return WebHost.CreateDefaultBuilder(args)
// this impacts *both* host and app config
.UseConfiguration(config)
.UseStartup<Startup>();
这个名字并没有什么魔力hostsettings.json
。事实上,我们可以将主机设置和应用程序设置合并到一个名为appsettings.json
。道路CreateDefaultBuilder
Works 鼓励我们将这些设置保持一定程度的独立。
我们可以在 *.json 文件中放入哪些密钥来配置主机?
这是键列表 https://github.com/aspnet/Hosting/blob/master/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs我们可以用它来配置主机:
"applicationName"
"startupAssembly"
"hostingStartupAssemblies"
"hostingStartupExcludeAssemblies"
"detailedErrors"
"environment"
"webroot"
"captureStartupErrors"
"urls"
"contentRoot"
"preferHostingUrls"
"preventHostingStartup"
"suppressStatusMessages"
"shutdownTimeoutSeconds"