【问题标题】:ASP.NET Core: JSON Configuration GetSection returns nullASP.NET Core:JSON 配置 GetSection 返回 null
【发布时间】:2017-10-13 20:54:19
【问题描述】:

我有一个文件appsettings.json,看起来像这样:

{
    "MyConfig": {
        "ConfigA": "value",
        "ConfigB": "value"
    }
}

在我的Startup.cs 中,我正在构建我的IConfiguration

public ConfigurationRoot Configuration { get; set; }

public Startup(ILoggerFactory loggerFactory, IHostingEnvironment environment)
{
      var builder = new ConfigurationBuilder()
                     .SetBasePath(environment.ContentRootPath)
                     .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)                             
                     .AddEnvironmentVariables();

      Configuration = builder.Build();
}

public void ConfigureServices(IServiceCollection services)
{
      //GetSection returns null...
      services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}

Configuration.GetSection("MyConfig") 总是返回null,尽管该值存在于我的 JSON 文件中。 Configuration.GetSection("MyConfig:ConfigA") 工作正常。

我做错了什么?

【问题讨论】:

标签: c# asp.net json configuration


【解决方案1】:

对于遇到这种情况并试图在测试项目中做同样事情的任何人,这对我有用:

other = config.GetSection("OtherSettings").Get<OtherSettings>();

【讨论】:

  • 这对于启动也很有用 - 你不想 Configure 因为你需要在 DI 中注册的设置,而不是在已解析的依赖项中。
【解决方案2】:

请参考以下代码

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        var config = Configuration.GetSection("MyConfig");
        // To get the value configA
        var value = config["ConfigA"];

        // or direct get the value
        var configA = Configuration.GetSection("MyConfig:ConfigA");

        var myConfig = new MyConfig();
        // This is to bind to your object
        Configuration.GetSection("MyConfig").Bind(myConfig);
        var value2 = myConfig.ConfigA;
    }
}

【讨论】:

  • 参考代码中的什么?我所看到的只是做同一件事的不同方式。
  • @DanFriedman 我刚刚发现这个问题试图解决相同的GetSection().Value 为空。为了获得价值,我在上面的代码中使用了GetSection("sectionName").Bind(myConfig),并在myConfig 实例属性中填充了配置部分sectionName
【解决方案3】:

我刚碰到这个。如果您使用完整路径,值就在那里,但我需要将它们自动绑定到配置类。

在我将自动属性访问器添加到我的类的属性后,.Bind(config) 开始工作。即

public class MyAppConfig {
  public string MyConfigProperty { get; set;} //this works
  public string MyConfigProperty2; //this does not work
}

【讨论】:

    【解决方案4】:

    这对我有用。

    public void ConfigureServices(IServiceCollection services)  
    {  
         services.Configure<MyConfig>(con=> Configuration.GetSection("MyConfig").Bind(con));  
    }
    

    【讨论】:

      【解决方案5】:

      我习惯于在我的类中使用字段而不是属性,我遇到的问题和你一样...

      原来它们需要是属性,否则它不会完成类的值而是将它们保留为默认值。

      基于this MSDN article 一个选项类:

      1. 必须是非抽象的,带有公共无参数构造函数。
      2. 该类型的所有公共读写属性均已绑定。
      3. 字段未绑定。在前面的代码中,Position 没有被绑定。使用 Position 属性,因此在将类绑定到配置提供程序时,不需要在应用中对字符串“Position”进行硬编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-15
        • 1970-01-01
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多