Каждый раз, когда я вызываю Configuration.GetSection, свойство Value возвращаемого объекта всегда равно нулю.

Мой 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 может потребоваться иметь одинаковое количество свойств для сопоставления или это может быть связано с определениями типов данных, но, возможно, они совершенно не связаны.

40
Liam Mueller 2 Сен 2017 в 22:48

9 ответов

Лучший ответ

Согласно Документы Microsoft: "Когда GetSection возвращает соответствующий раздел, значение не заполняется. Ключ и путь возвращаются, когда раздел существует."

Если вы хотите увидеть значения этого раздела, вам нужно вызвать метод GetChildren (): Configuration.GetSection("SqliteSettings").GetChildren();

Или вы можете использовать: Configuration.GetSection("SqliteSettings").Get<SqliteSettings>() . JSON не обязательно должен иметь одинаковое количество свойств для сопоставления. Несоответствующие обнуляемым свойствам будет присвоено значение NULL, а ненулевым несоответствующим свойствам будет присвоено значение по умолчанию (например, int будет установлено в 0).

57
Rick Riensche 26 Фев 2019 в 19:59

Просто измените ваш метод ConfigureServices следующим образом:

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

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

    services.AddMvc();
}

И это должно работать.

13
Cody Gray 15 Фев 2019 в 19:36

Если у вас есть файл appsettings.Development.json, убедитесь, что параметры «ConnectionStrings: DefaultConnection» одинаковы в файлах appsettings.Development.json и appsettings.json.

-1
Cody Gray 15 Фев 2019 в 19:37

Это работало для меня в консольном приложении:

var connectionString = config["ConnectionStrings:DefaultConnection"]
2
Cody Gray 15 Фев 2019 в 19:36
var serviceProvider = services.BuildServiceProvider();

Должен прийти после всех services.Configure звонков.

2
Cody Gray 15 Фев 2019 в 19:35

Если все остальные ответы не решают проблему, еще одна причина может заключаться в том, что свойства класса Options являются частными (или не имеют доступных установщиков).

2
Tamás Szabó 18 Сен 2019 в 14:28

Попробуйте добавить ConfigurationProvider в ConfigurationBuilder.

Конфигурация приложения предоставляется из:

  • appsettings.json с помощью провайдера конфигурации файлов.
  • appsettings. {Environment} .json с использованием поставщика конфигурации файлов.
0
Donald 21 Май 2019 в 13:18

В моем случае для Web Api Core 2.1 мне понадобилось Program.cs в корневой папке проекта (в той же папке, что и Startup.cs).

0
Cody Gray 15 Фев 2019 в 19:36
  1. Щелкните правой кнопкой мыши appsettings.json и перейдите в Свойства.
  2. Выберите Скопировать в выходной каталог = Копировать всегда.
7
Cody Gray 15 Фев 2019 в 19:36