web-dev-qa-db-fra.com

Configuration.GetSection renvoie toujours la valeur null

Chaque fois que j'appelle Configuration.GetSection, la propriété Value de l'objet renvoyé est toujours null.

Mon constructeur Startup

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

    this.Configuration = builder.Build();
}

Ma méthode ConfigureServices

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

    services.AddOptions();

    services.AddMvc();
}

Mon appsettings.json

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

La classe que j'utilise pour définir 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
}

Je pensais que le JSON aurait peut-être besoin de la même quantité de propriétés, ou est-ce que cela a quelque chose à voir avec les définitions de type de données, mais celles-ci n'ont peut-être aucun lien.

12
Liam Mueller

Modifiez simplement votre méthode ConfigureServices pour qu'elle ressemble à ce qui suit:

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

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

    services.AddMvc();
}

et ça devrait marcher.

9
Ali

Selon le Microsoft Docs : "Lorsque GetSection renvoie une section correspondante, Value n'est pas renseignée. Une clé et un chemin sont renvoyés lorsque la section existe."

Si vous souhaitez voir les valeurs de cette section, vous devrez appeler la méthode GetChildren (): Configuration.GetSection("SqliteSettings").GetChildren();

Ou vous pouvez utiliser: Configuration.GetSection("SqliteSettings").Get<SqliteSettings>(). JSON n'a pas besoin d'avoir le même nombre de propriétés pour correspondre. Les propriétés nullables sans correspondance seront définies sur null et les propriétés sans correspondance non nulles seront définies sur leur valeur par défaut (par exemple, int sera défini sur 0).

2
Ivan Agrenich
  1. Cliquez avec le bouton droit sur appsettings.json et accédez à Propriétés.
  2. Sélectionnez Copier dans le répertoire de sortie = Toujours copier.
1
Anmol Rastogi

Cela a fonctionné pour moi dans une application console:

var connectionString = config["ConnectionStrings:DefaultConnection"]
0
Sameh
var serviceProvider = services.BuildServiceProvider();

doit venir après tous les appels services.Configure.

0
Amorphis

Dans le cas de Web Api Core 2.1, j'avais besoin de Program.cs dans le dossier racine du projet (le même dossier que Startup.cs).

0
Eric Schneider