webentwicklung-frage-antwort-db.com.de

Configuration.GetSection gibt immer null zurück

Bei jedem Aufruf von Configuration.GetSection ist die Value-Eigenschaft des zurückgegebenen Objekts immer null.

Mein Startup -Konstruktor

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

    this.Configuration = builder.Build();
}

Meine ConfigureServices Methode

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

    services.AddOptions();

    services.AddMvc();
}

Mein appsettings.json

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

Die Klasse, die ich zum Definieren von SqliteSettings verwende

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
}

Ich dachte, dass JSON möglicherweise die gleiche Menge an Eigenschaften haben muss, um zu passen, oder hat es etwas mit Datentypdefinitionen zu tun?.

12
Liam Mueller

Ändern Sie einfach Ihre ConfigureServices-Methode wie folgt:

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

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

    services.AddMvc();
}

und es sollte funktionieren.

9
Ali

Laut " Microsoft Docs : " Wenn GetSection einen übereinstimmenden Abschnitt zurückgibt, wird Value nicht gefüllt. Wenn der Abschnitt vorhanden ist, werden ein Schlüssel und ein Pfad zurückgegeben. "

Wenn Sie die Werte dieses Abschnitts anzeigen möchten, müssen Sie die GetChildren () - Methode aufrufen: Configuration.GetSection("SqliteSettings").GetChildren();

Oder Sie können verwenden: Configuration.GetSection("SqliteSettings").Get<SqliteSettings>(). Der JSON muss nicht die gleiche Menge an Eigenschaften haben, um abzugleichen. Nicht übereinstimmende nullfähige Eigenschaften werden auf null gesetzt, und nicht-nullfähige nicht übereinstimmende Eigenschaften werden auf ihren Standardwert gesetzt (z. B. wird int auf 0 gesetzt).

2
Ivan Agrenich
  1. Klicken Sie mit der rechten Maustaste auf appsettings.json und gehen Sie zu Eigenschaften.
  2. Wählen Sie In Ausgabeverzeichnis kopieren = Immer kopieren.
1
Anmol Rastogi

Versuchen Sie, ConfigurationProvider zu ConfigurationBuilder hinzuzufügen.

Die App-Konfiguration wird bereitgestellt von:

  • appsettings.json mit dem File Configuration Provider.
  • appsettings. {Environment} .json mit dem File Configuration Provider.
0
Donald

Dies funktionierte für mich in einer Konsolenanwendung:

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

muss nach allen services.Configure-Aufrufen kommen.

0
Amorphis

In meinem Fall für Web Api Core 2.1 benötigte ich Program.cs im Stammordner des Projekts (im selben Ordner wie Startup.cs).

0
Eric Schneider