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
- Щелкните правой кнопкой мыши на
appsettings.json
и перейдите в Свойства. - Выберите Скопировать в выходной каталог = Копировать всегда.
Ответ 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 ищет файлы в этой папке