2016-04-27 13 views
0

Während der Erstellung einer. NET-Konsole App, die die neue ConfigurationBuilder Implementierung für was früher appSettings verwendet wurde, habe ich auf ein Problem stoßen..NET Konsole App nicht lesen config.json

Ich habe den folgenden Code:

public static void Main(string[] args) 
{ 
    try 
    { 
     var builder = new ConfigurationBuilder().AddJsonFile("config.json"); 
     var config = builder.Build(); 

     if (config["Azure"] != null) 
     { 
      ; 
     } 
    } 
    catch (System.IO.FileNotFoundException exception) 
    { 
     ... 
    } 
} 

Die config.json-Datei im selben Verzeichnis ist und sieht wie folgt aus:

{ 
    "Azure": { 
    "Storage": { 
     "ConnectionString": "...", 
     "ContainerName": "..." 
    } 
    }, 
    "Data": { 
    "DefaultConnection": { 
     "ConnectionString": "..." 
    } 
    }, 
    "Logging": { 
    "RecordProgress": "..." 
    } 
} 

Aber das config Objekt enthält keine Schlüssel.

Ich habe irgendwo gelesen, dass, wenn der Dateipfad an AddJsonFile übergeben wird nicht gefunden werden kann, dann wirft es eine FileNotFoundException, aber in meinem Code wird diese Ausnahme nie ausgelöst.

Also angenommen, die Datei config.json kann gefunden werden, warum werden die Einstellungen nicht geladen?

Antwort

5

Meine ursprüngliche Antwort war falsch. Hier ist eine aktualisierte Version. Dies basiert auf der kürzlich veröffentlichten RC2.

Die aktuelle Laufzeit wird FileNotFoundException werfen, wenn die Konfigurationsdatei nicht gefunden wird. Die Erweiterungsmethode AddJsonFile() verwendet einen optionalen Parameter namens optional, der bei einem true dazu führt, dass die Methode nicht ausgelöst wird.

Ich habe config.json hinzugefügt und es wird nicht in das bin-Verzeichnis kopiert, daher musste ich den Speicherort mit der Erweiterungsmethode SetBasePath() angeben. Das ist, was die Webprojektvorlagen in Start unter Verwendung von IHostingEnvironment.ContentRootPath tun. In Konsolen-Apps können Sie Directory.GetCurrentDirectory() verwenden.

var builder = new ConfigurationBuilder() 
    .SetBasePath(Directory.GetCurrentDirectory()) 
    .AddJsonFile("config.json"); 

var config = builder.Build(); 

schließlich die config["Key"] Indexer für mich nicht funktioniert hat. Stattdessen musste ich die Erweiterungsmethode GetSection() verwenden. Auf Ihre obige Beispielkonfigurationsdatei kann zugegriffen werden mit:

// var result = config["Logging"]; 
var section = config.GetSection("Logging"); 
var result = section["RecordProgress"]; 

Ich habe die alte Antwort für die Zeit verlassen.

Alte Antwort: Ich fand eine mögliche Lösung hier: https://github.com/aspnet/Mvc/issues/4481.

Zitat aus dem Problem.

Danke für das Repro-Projekt. Offensichtlich müssen Sie die project.json Datei aktualisieren, um den Knoten "content" zu haben, und Config.json hier angeben.

Beispiel: https://github.com/aspnet/MusicStore/blob/dev/src/MusicStore/project.json#L22

Es scheint, dass ein neues Inhaltselement kann in Ihrem project.json erforderlich.

... "content": [ "Areas", "Views", "wwwroot", "config.json", "web.config" ], ...

+0

Danke für die Anregung @Todd aber dies hatte keine Wirkung, wenn ich es versucht. – awj