2016-04-27 1 views
0

Lors de la création d'une application de console .net qui utilise la nouvelle implémentation ConfigurationBuilder pour ce qui était auparavant appSettings, j'ai rencontré un problème.L'application console .NET ne lit pas config.json

Je le code suivant:

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) 
    { 
     ... 
    } 
} 

Le fichier config.json est dans le même répertoire et ressemble à ceci:

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

Mais l'objet config ne contient aucune clé.

J'ai lu quelque part que si le chemin du fichier passé à AddJsonFile ne peut pas être trouvé alors il lance un FileNotFoundException mais dans mon code cette exception n'est jamais levée.

Donc, en supposant que le fichier config.json peut trouvé, pourquoi les paramètres ne sont pas chargés?

Répondre

5

Ma réponse originale était fausse. Voici une version mise à jour. Ceci est basé sur le RC2 récemment publié.

L'exécution actuelle lancera FileNotFoundException si le fichier de configuration est introuvable. La méthode d'extension AddJsonFile() prend un paramètre facultatif appelé optional qui, si la valeur est true, empêche la méthode de lancer.

J'ai ajouté config.json et il n'est pas copié dans le répertoire bin, donc j'ai dû spécifier l'emplacement en utilisant la méthode d'extension SetBasePath(). C'est ce que font les modèles de projet Web dans Startup, en utilisant IHostingEnvironment.ContentRootPath. Dans les applications de console, vous pouvez utiliser Directory.GetCurrentDirectory().

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

var config = builder.Build(); 

Enfin, le config["Key"] indexeur ne fonctionne pas pour moi. Au lieu de cela, j'ai dû utiliser la méthode d'extension GetSection(). Donc, votre exemple de fichier de configuration ci-dessus peut être consulté avec:

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

J'ai laissé l'ancienne réponse pour le moment.

Ancienne réponse: J'ai trouvé une solution possible ici: https://github.com/aspnet/Mvc/issues/4481.

Citation du problème.

Merci pour le projet repro. Il semble que vous ayez besoin de mettre à jour le fichier project.json pour avoir le noeud "content" et que Config.json soit spécifié ici.

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

Il semble qu'un nouvel élément de contenu peut être nécessaire dans votre project.json.

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

+0

Merci pour la suggestion @Todd mais cela n'a eu aucun effet quand je l'ai essayé. – awj