ASP.NET Core:JSON 配置 GetSection 返回 null

15

我有一个名为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") 却能正常工作。

我做错了什么?


5
我也遇到了相同的问题,你有解决方法吗? - Stay Foolish
这也可能是你的问题吗? https://dev59.com/N6vka4cB1Zd3GeqP0OIA - Rajiv
6个回答

18

对于任何试图在测试项目中实现此功能的人,以下是我使用的方法:

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

这对于初创公司也很有用 - 在那里,您不想进行“配置”,因为您需要在 DI 中注册设置,而不是在已解决的依赖项中。 - oatsoda

5
请参考下面的代码:
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;
    }
}

1
在代码中指的是什么?我只看到了一种不同的做法。 - Dan Friedman
@DanFriedman 我刚刚发现了这个问题,尝试解决相同的 GetSection().Value 为空。为了获取值,我使用了 GetSection("sectionName").Bind(myConfig),就像上面的代码一样,并且已经得到了 myConfig 实例属性被配置部分 sectionName 的值填充。 - oleksa

4

我刚刚遇到了这个问题。如果您使用完整路径,值是存在的,但我需要将它们自动绑定到配置类。

.Bind(config) 在我为我的类的属性添加自动属性访问器后开始工作。例如:

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

1
这对我有用。

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

1
我习惯在我的类中使用字段而不是属性,我遇到了与你相同的问题...
事实证明它们需要是属性,否则它不会完成类的值,而是将它们保留为默认值。
根据这篇MSDN文章,选项类应该:
  1. 必须是具有公共无参数构造函数的非抽象类。
  2. 类型的所有公共读写属性都被绑定。
  3. 字段未被绑定。在上述代码中,Position未被绑定。使用Position属性是为了在将类绑定到配置提供程序时,应用程序不需要硬编码字符串"Position"。

0
我遇到了同样的问题。我在主机构建器上下文中检查了配置对象。它在不同的目录中寻找appsettings.json,例如"我的根目录\发布"而不是"我的根目录"。这是因为我的调试配置文件的工作目录不知何故被设置为"我的根目录\发布"。
我从项目的调试配置文件中删除了工作目录设置中的"\发布",问题得到解决。
您可以通过右键单击项目并导航到属性->调试->常规,在调试模式下找到项目的工作目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接