WebHost 从 appsettings.json 中读取了哪些值

Which values does WebHost read from appsettings.json

在 .Net Core 中,您可以使用 WebHost 自托管 Web 服务器。有一个名为 CreateDefaultBuilder() 的方法,Microsoft documentation 声明如下:

CreateDefaultBuilder performs the following tasks:

  • Loads app configuration from:
  • appsettings.json.

但是,似乎没有任何文档说明您可以将哪些参数放入 appsettings.json 以使 WebHost 自动获取默认值以外的配置值。

例如,我尝试将以下内容添加到我的 appsettings.json,但无论如何服务器都以 http://localhost:5000 启动:

{
  "Kestrel" : {
    "urls" : "http://*:8080"
  },
  "server" : {
    "urls" : "http://*:8080"
  }
}

我知道我可以使用 ConfigurationBuilder 自己阅读 appsettings.json,但这有点违背了文档的目的

那么,我需要在我的 appsettings.json 文件中输入什么才能让 CreateDefaultBuilder() 不使用默认值?也欢迎列出要放入 appsettings.json 的所有可能值。

为什么 CreateDefaultBuilder 不使用 appsettings.json 值配置主机?

部分答案是区分主机和应用配置。 The documentation 表示 CreateDefaultBuilder...

  • Loads host configuration from:
    • Environment variables prefixed with ASPNETCORE_ ...
    • Command-line arguments.
  • Loads app configuration from:
    • appsettings.json.
    • appsettings.{Environment}.json.

CreateDefaultBuilder 中,appsettings.json 不会自动影响主机的原因是这些设置正在配置应用程序,而应用程序配置不会影响主机配置。文档表明,当它说:

IWebHostBuilder configuration is added to the app's configuration, but the converse isn't true — ConfigureAppConfiguration doesn't affect the IWebHostBuilder configuration.

查看 source code 表明 CreateDefaultBuilder 方法仅从其对 ConfigureAppConfiguration 的调用中添加 appsettings.json 值。这就是为什么这些值不会自动影响主机的原因。

我们如何使用 *.json 文件中的值配置主机?

CreateDefaultBuilder 不会使用 *.json 文件自动配置主机。我们需要手动执行此操作,并且 the documentation specifies how。在该示例中,该文件名为 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 的工作方式鼓励我们将这些设置分开。

我们可以在 *.json 文件中放入哪些密钥来配置主机?

这是我们可以用来配置主机的list of keys

"applicationName"
"startupAssembly"
"hostingStartupAssemblies"
"hostingStartupExcludeAssemblies"
"detailedErrors"
"environment"
"webroot"
"captureStartupErrors"
"urls"
"contentRoot"
"preferHostingUrls"
"preventHostingStartup"
"suppressStatusMessages"
"shutdownTimeoutSeconds"