【问题标题】:Which values does WebHost read from appsettings.jsonWebHost 从 appsettings.json 读取哪些值
【发布时间】:2018-08-25 21:23:39
【问题描述】:

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

CreateDefaultBuilder 执行以下任务:

  • 从以下位置加载应用配置:
  • 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 的列表。

【问题讨论】:

    标签: asp.net-core .net-core self-hosting


    【解决方案1】:

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

    部分答案是区分主机和应用配置。 The documentationCreateDefaultBuilder...

    • 从以下位置加载 主机 配置:
      • 以 ASPNETCORE_ 为前缀的环境变量 ...
      • 命令行参数。
    • 从以下位置加载 app 配置:
      • appsettings.json.
      • appsettings.{Environment}.json.

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

    IWebHostBuilder 配置已添加到应用程序的配置中,但反之则不然 - ConfigureAppConfiguration 不会影响 IWebHostBuilder 配置。

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

    我们如何使用 *.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"
    

    【讨论】:

    • 感谢您的全面回答!我猜主机和应用程序配置之间的区别以及缺少自动加载不够明显,毕竟我必须使用ConfigurationBuilder(并不是说有什么问题)。
    • 不客气。我很高兴听到答案有所帮助。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多