Configuration.GetSection always returns Value property null
Every time I call Configuration.GetSection
, the Value
property of the returned object is always null.
My Startup
constructor
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
My ConfigureServices
method
public void ConfigureServices(IServiceCollection services)
{
services.Configure<SqliteSettings>(opts => Configuration.GetSection("SqliteSettings").Bind(opts));
services.AddOptions();
services.AddMvc();
}
My appsettings.json
{
"SqliteSettings": {
"DataSource": "C:\\db.sqlite",
"NewDatabase": true,
"Version": 3
}
}
The class I'm using to define 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
}
I was thinking the JSON might need to have the same amount of properties to match, or is it might be something to do with data type definitions, but maybe those are completely unrelated.
According to the Microsoft Docs:
When GetSection returns a matching section, Value isn't populated. A Key and Path are returned when the section exists.
If you want to see the values of that section you will need to call the GetChildren() method: Configuration.GetSection("SqliteSettings").GetChildren();
Or you can use:
Configuration.GetSection("SqliteSettings").Get<SqliteSettings>()
. The JSON does not need to have the same amount of properties to match. Unmatched nullable properties will be set to null and non-nullable unmatched properties will be set to their default value (e.g. int will be set to 0).
- Right-click on
appsettings.json
and go to Properties. - Select Copy to output directory = Copy always.
Just modify your ConfigureServices
method to be like following:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<SqliteSettings>(Configuration.GetSection("SqliteSettings"));
services.AddMvc();
}
and it should work.
If all the other answers do not fix the problem, another reason could be that the properties of the Options class are private (or do not have accessible setters).