Configuration.GetSection始终返回null

时间:2017-09-02 19:48:15

标签: c# asp.net-core .net-core

每次调用Configuration.GetSection时,返回对象的Value属性始终为null。

我的Startup构造函数

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

    this.Configuration = builder.Build();
}

我的ConfigureServices方法

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<SqliteSettings>(opts => Configuration.GetSection("SqliteSettings").Bind(opts));

    services.AddOptions();

    services.AddMvc();
}

我的appsettings.json

{
  "SqliteSettings": {
    "DataSource": "C:\\db.sqlite",
    "NewDatabase": true,
    "Version": 3
  }
}

我用来定义SqliteSettings

的类
public class SqliteSettings
{
    public string DataSource { get; set; }

    public bool? NewDatabase { get; set; }

    public int? Version { get; set; }

    public string Password { get; set; }

    public long? CacheSize { get; set; }

    // More properties
}

我认为JSON可能需要具有相同数量的属性才能匹配,或者它可能与数据类型定义有关,但可能与这些属性完全无关。

11 个答案:

答案 0 :(得分:10)

只需修改您的ConfigureServices方法即可:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();

    services.Configure<SqliteSettings>(Configuration.GetSection("SqliteSettings"));

    services.AddMvc();
}

它应该有用。

答案 1 :(得分:5)

根据Microsoft Docs“当GetSection返回匹配的节时,不会填充Value。当该节存在时,将返回Key和Path。”

如果要查看该部分的值,则需要调用GetChildren()方法:Configuration.GetSection("SqliteSettings").GetChildren();

或者您可以使用: Configuration.GetSection("SqliteSettings").Get<SqliteSettings>()。 JSON不需要具有相同数量的属性即可匹配。不匹配的可为空的属性将设置为null,不可匹配的不可为空的属性将设置为其默认值(例如,int将设置为0)。

答案 2 :(得分:2)

  1. 右键单击appsettings.json,然后转到“属性”。
  2. 选择“复制到输出目录=始终复制”。

答案 3 :(得分:0)

这在我的控制台应用程序中起作用了:

var connectionString = config["ConnectionStrings:DefaultConnection"]

答案 4 :(得分:0)

var serviceProvider = services.BuildServiceProvider();

必须在所有services.Configure个电话之后进行。

答案 5 :(得分:0)

对于Web Api Core 2.1,我需要项目根文件夹(与Startup.cs相同的文件夹)中的Program.cs

答案 6 :(得分:0)

尝试将ConfigurationProvider添加到ConfigurationBuilder。

应用程序配置从以下位置提供:

  • 使用文件配置提供程序的appsettings.json。
  • appsettings。{Environment} .json使用文件配置提供程序。

答案 7 :(得分:0)

如果所有其他答案都不能解决问题,则另一个原因可能是Options类的属性是私有的(或没有可访问的setter)。

答案 8 :(得分:0)

我的问题是.bind()方法的对象实例未初始化。

predict(mod1, data.frame(Week=1:10, Sex=factor(FACTORfemale), No_Squares=NEWSQUARES),
        type="response"
        # , se=TRUE  ## unused argument
)
# 1        2        3        4        5        6        7        8        9       10       11       12 
# 11.91329 11.67287 12.21171 11.29497 11.74180 11.73457 11.04548 11.78727 11.33035 11.55541 12.10291 11.85865 
# 13       14       15       16       17       18       19       20       21       22       23       24 
# 12.40607 11.47474 11.92869 11.92134 11.22128 11.97488 11.51069 11.73933 12.29554 12.04740 12.60353 11.65738 
# 25       26       27       28       29       30       31       32       33       34       35       36 
# 12.11855 12.11109 11.39988 12.16548 11.69390 11.92618 12.49124 12.23915 12.80414 11.84292 12.31143 12.30385 
# 37       38       39       40       41       42       43       44       45       46       47       48 
# 11.58133 12.35911 11.88002 12.11600 12.69005 12.43395 13.00793 12.03141 12.50738 12.49968 11.76566 12.55582 
# 49       50       51       52       53       54       55       56       57       58       59       60 
# 12.06911 12.30884 12.89203 12.63186 13.21497 12.22291 12.70645 12.69863 11.95292 12.75566 12.26120 12.50475 
# 61       62       63       64       65       66       67       68       69       70       71       72 
# 13.09723 12.83291 13.42530 12.41745 12.90869 12.90075 12.14317 12.95869 12.45635 12.70378 13.30569 13.03716 
# 73       74       75       76       77       78       79       80       81       82       83       84 
# 13.63898 12.61509 13.11415 13.10608 12.33644 13.16494 12.65461 12.90598 13.51746 13.24466 13.85607 12.81588 
# 85       86       87       88       89       90       91       92       93       94       95       96 
# 13.32288 13.31468 12.53280 13.37448 12.85603 13.11139 13.73261 13.45547 14.07660 13.01986 13.53493 13.52660 
# 97       98       99      100 
# 12.73227 13.58735 13.06065 13.32008

因此,在调用.bind(opts);之前;我初始化了值:

services.Configure<SqliteSettings>(opts => Configuration.GetSection("SqliteSettings").Bind(opts));

绑定本地设置变量:

SqlliteSettings opts = new SqliteSettings();

分别对容器进行注册:

Configuration.GetSection(AppSettingsSectionName).Bind(opts);

这解决了问题,因为当提供的实例为null时,.Bind()方法将仅返回null。

答案 9 :(得分:0)

如果你的依赖注入失败了,并且你在调试之后断定是这个方法有问题,那就不是!

注册就够了:

services.Configure<SqliteSettings>(Configuration.GetSection("SqliteSettings"));

您必须在 IOptions 接口中注入您的配置类。这将解决DI问题。我在这个问题上浪费了几个小时,希望它可以帮助其他人。

答案 10 :(得分:-1)

如果您有appsettings.Development.json文件,请确保appsettings.Development.jsonappsettings.json文件中的“ ConnectionStrings:DefaultConnection”设置相同。