【问题标题】:asp.net core 2.1 read appsettings in Program.cs using IWebHostBuilder GetSettingasp.net core 2.1 使用 IWebHostBuilder GetSetting 读取 Program.cs 中的 appsettings
【发布时间】:2018-10-01 12:34:24
【问题描述】:

我有这个代码:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {

        var hostBuilder = WebHost.CreateDefaultBuilder(args);

        var settingName = "SHUTDOWNTIMEOUTSECONDS";
        var settingTiemOut= hostBuilder.GetSetting(settingName);
        //...
        //convert to double dbltimeout
        //...
        hostBuilder
            .UseShutdownTimeout(TimeSpan.FromSeconds(dbltimeout))
            .UseStartup<Startup>();

        return hostBuilder;
    }
}

我了解 CreateDefaultBuilder 加载配置 'appsettings.json'、环境变量和命令行参数。 如果我在 launchSettings.json 中定义 SHUTDOWNTIMEOUTSECONDS,例如:

  "environmentVariables": {
    "ASPNETCORE_SHUTDOWNTIMEOUTSECONDS": "30"
  }

然后 settingTiemout 正确设置为 30。 但是,如果我将其从 launchSettings.json 中删除并将其添加到 appsettings.json 中,则 settingTiemout 会变为 null。 为什么?

谢谢

【问题讨论】:

    标签: asp.net-core-2.1


    【解决方案1】:

    它为空,因为此时它不再是“设置”。它的配置,根据docs:

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

    换句话说,类似appsettings.json 的配置对主机构建器不可用,因为它是在ConfigureAppConfiguration 中定义的,直到构建主机之后才可用。要为实际的主机构建器添加 JSON 配置,您需要使用 UseConfiguration 扩展来覆盖主机构建器配置。例如:

    var hostBuilder = WebHost.CreateDefaultBuilder(args);
    
    ...
    
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hostsettings.json", optional: true)
        .AddCommandLine(args)
        .Build();
    hostBuilder.UseConfiguration(config);
    

    这里使用了一个单独的 JSON 文件,因为配置的格式很重要。具体来说,它需要与主机构建器期望的配置变量名称相匹配,这会阻止在 JSON 文件中使用部分,就像您通常在 appsettings.json 中看到的那样。换句话说,使用此设置,您只需将hostsettings.json 文件添加到您的项目中,其中包含以下内容:

    {
        "shutdownTimeoutSeconds": 30
    }
    

    您可以咨询this static class 以了解支持的可用密钥名称以放入您的 JSON 文件中。

    【讨论】:

    • 感谢克里斯·普拉特。因此,launchSettings.json 是设置( IWebHostBuilder 的)。 appsettings.json 中定义的是应用配置。只有在 Build() 之后,这两个才会在应用程序配置中可用。让我感到困惑的是 CreateDefaultBuilder() 的评论,它说从“appsettings.json”、环境变量、命令行参数等加载,但只有在 Build() 之后才错过。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2015-10-05
    • 2021-01-05
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多