Configuration.GetSection всегда возвращает null

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

Ответы

Ответ 1

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

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

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

    services.AddMvc();
}

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

Ответ 2

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

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

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

Ответ 3

  1. Щелкните правой кнопкой мыши на appsettings.json и перейдите в Свойства.
  2. Выберите Скопировать в выходной каталог = Копировать всегда.

Ответ 4

var serviceProvider = services.BuildServiceProvider();

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

Ответ 5

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

var connectionString = config["ConnectionStrings:DefaultConnection"]

Ответ 6

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

Ответ 7

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

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

  • appsettings.json с помощью провайдера конфигурации файлов.
  • appsettings. {Environment}.json с использованием поставщика конфигурации файлов.

Ответ 8

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

Ответ 9

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

Ответ 10

wwwroot меня была эта проблема, но проблема была в том, что я поставил свой конфигурационный файл json в неправильное место... я должен был поместить его в папку wwwroot. потому что ядро asp.net ищет файлы в этой папке