【问题标题】:Configuration.GetSection("SectionName") is always null when using manually added settings.json file to dotnet core console app使用手动添加的 settings.json 文件到 dotnet 核心控制台应用程序时,Configuration.GetSection("SectionName") 始终为空
【发布时间】:2019-10-18 18:32:58
【问题描述】:

我正在尝试将 settings.json 文件手动添加到 .net core 2.1 控制台应用程序。所以我将这些 NuGet 包添加到项目中:

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.FileExtensions

Microsoft.Extensions.Configuration.Json

并像这样创建appsettings.json 文件:

{
  "Section1": {
    "Prop1": "value",
    "Prop2": 300
  }
}

最后,我尝试从设置文件中获取值,如下所示:

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

_configuration = builder.Build();
var section = _configuration.GetSection("Section1");//section.Value is null
var test = _configuration.GetSection("Section1:Prop1");//it returns the proper value
var model = section as Section1Model;

但是,section.Valuenull,因此,modelnull。如果我尝试获取像 _configuration.GetSection("Section1:Prop1") 这样的值,它会返回正确的值。此外,如果我调用_configuration.GetSection("Section1).GetChildren(),它会返回一组设置。我做错了什么?

P.S:我保证将设置文件复制到 bin 文件夹中

【问题讨论】:

  • 很可能是因为 json 文件不在您的二进制文件所在的目录中。
  • 是的。否则,_configuration.GetSection("Section1:Prop1") 如何正常工作?
  • 如果设置了 optional:false 会发生什么?我想你没有将 appsettings.json 文件复制到 bin 目录中,所以它从来没有真正读取你的文件。
  • @asawyer 没什么,和以前一样。我保证将设置文件复制到 bin 目录!
  • ConfigurationBuilder 不会神奇地咳出Section1Model 对象。您将获得一个通用的IConfigurationSection 接口,其属性可通过索引器或GetChildren 访问,但没有Value,因为这仅适用于标量。要将其绑定到普通的旧对象,请使用 ConfigurationBinder.Get()ConfgurationBinder.Bind()。 (通常,这是通过在 ServiceCollection 上调用适当的扩展方法来在幕后完成的,例如 .AddOptions,但如果需要,您可以手动执行操作。)

标签: c# .net-core


【解决方案1】:

ConfigurationBuilder 仅返回通用 IConfiguration 实例。如果您想要一个强类型模型,则必须首先绑定它。有几种方法可以做到这一点——微软自己的实现位于Microsoft.Extensions.Configuration.Binder。然后,这使您可以通过 IConfiguration 上的扩展方法以多种方式访问​​静态类 ConfigurationBinder

var model = _configuration.GetSection("Section1").Get<Section1Model>();

奇怪的是,没有直接将部分放入对象的扩展方法,但编写一个很容易。

如果您使用依赖注入(Microsoft.Extensions.DependencyInjectionMicrosoft.Extensions.Options.ConfigurationExtensions),则将有一个 .Configure&lt;Section1Model&gt;() 扩展方法来注册此绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2019-09-26
    • 2018-02-25
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    相关资源
    最近更新 更多