Comment lire les valeurs AppSettings à partir d'un fichier .json dans ASP.NET Core

247

J'ai configuré mes données AppSettings dans le fichier appsettings / Config .json comme ceci:

{
  "AppSettings": {
        "token": "1234"
    }
}

J'ai cherché en ligne sur la façon de lire les valeurs AppSettings du fichier .json, mais je n'ai rien pu trouver d'utile.

J'ai essayé:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

Je sais qu'avec ASP.NET 4.0, vous pouvez le faire:

System.Configuration.ConfigurationManager.AppSettings["token"];

Mais comment faire cela dans ASP.NET Core?

Oluwafemi
la source
cela peut même être simplifié simplement en utilisant l'injection de dépendances de IConfiguration (dans .net core 2.0). Ce qui est expliqué ici coding-issues.com/2018/10/…
Ranadheer Reddy
@RanadheerReddy, l'injection de dépendances fonctionne pour les contrôleurs. Mais que faire si quelqu'un a besoin de lire une valeur dans le middleware?
Alexander Ryan Baggett

Réponses:

320

Cela a eu quelques rebondissements. J'ai modifié cette réponse pour être à jour avec ASP.NET Core 2.0 (au 26/02/2018).

Ceci est principalement tiré de la documentation officielle :

Pour travailler avec les paramètres de votre application ASP.NET, il est recommandé d'instancier uniquement un Configurationdans la Startupclasse de votre application . Ensuite, utilisez le modèle Options pour accéder aux paramètres individuels. Disons que nous avons un appsettings.jsonfichier qui ressemble à ceci:

{
  "MyConfig": {
   "ApplicationName": "MyApp",
   "Version": "1.0.0"
   }

}

Et nous avons un objet POCO représentant la configuration:

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

Maintenant, nous construisons la configuration dans Startup.cs:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

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

        Configuration = builder.Build();
    }
}

Notez que appsettings.jsonsera enregistré par défaut dans .NET Core 2.0. Nous pouvons également enregistrer unappsettings.{Environment}.json fichier de configuration par environnement si nécessaire.

Si nous voulons injecter notre configuration dans nos contrôleurs, nous devons l'enregistrer avec le runtime. Nous le faisons via Startup.ConfigureServices:

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

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}

Et nous l'injectons comme ceci:

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

La Startupclasse complète :

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

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

        Configuration = builder.Build();
    }

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

        // Add functionality to inject IOptions<T>
        services.AddOptions();

        // Add our Config object so it can be injected
        services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
    }
}
Yuval Itzchakov
la source
3
la version ne "1.0.0-beta4"fonctionne pas sur la mienne "1.0.0-alpha4". Merci beaucoup!
Oluwafemi
2
J'ai besoin de passer un paramètre à une autre couche à partir d'une classe utilitaire, j'ai donc besoin de quelque chose comme cette chaîne statique publique GetConnectionString () {if (string.IsNullOrEmpty (connectionString)) {var builder = new ConfigurationBuilder () .AddJsonFile ("config.json "); Configuration = builder.Build (); connectionString = Configuration.Get ("Data: DefaultConnection: ConnectionString"); }} return connectionString; }
dnxit
2
Je reçoisArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
Peter
5
Après avoir ajouté la pépite, Microsoft.Extensions.Options.ConfigurationExtensionscela a fonctionné comme prévu.
Peter
2
Belle explication de la logique du processus de configuration, mais il manque un point majeur: SetBasePath () et AddJsonFile () sont des méthodes d'extension, profondément ancrées dans le cadre dans des assemblys séparés. Donc, pour commencer, il faut installer Microsoft.Extensions.Configuration.FileExtensions et Microsoft.Extensions.Configuration.Json en plus de Microsoft.Extensions.Configuration.
Bozhidar Stoyneff
63

Tout d'abord: le nom de l'assembly et l'espace de noms de Microsoft.Framework.ConfigurationModel ont changé pour Microsoft.Framework.Configuration. Vous devez donc utiliser: par exemple

"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"

comme dépendance dans project.json. Utilisez beta5 ou 6 si vous n'en avez pas 7 installé. Ensuite, vous pouvez faire quelque chose comme ça dans Startup.cs.

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
     var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
     Configuration = configurationBuilder.Build();
}

Si vous souhaitez ensuite récupérer une variable à partir du fichier config.json, vous pouvez l'obtenir immédiatement en utilisant:

public void Configure(IApplicationBuilder app)
{
    // Add .Value to get the token string
    var token = Configuration.GetSection("AppSettings:token");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("This is a token with key (" + token.Key + ") " + token.Value);
    });
}

ou vous pouvez créer une classe appelée AppSettings comme ceci:

public class AppSettings
{
    public string token { get; set; }
}

et configurer les services comme ceci:

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

    services.Configure<MvcOptions>(options =>
    {
        //mvc options
    });

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

puis y accéder par exemple via un contrôleur comme celui-ci:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}
étreinte
la source
pouvez-vous s'il vous plaît partager la configuration json pour "AppSettings" pour référence
Ankit Mori
J'ai besoin de configs appSettings.json entières en classe, pour cela, j'ai conçu la classe selon JSON et utilisé Configuration.Get<AppSettings>()pour désérialiser le fichier entier au lieu d'une section spécifique.
Nilay
52

Pour .NET Core 2.0, les choses ont un peu changé. Le constructeur de démarrage prend un objet Configuration comme paramètre, il ConfigurationBuildern'est donc pas nécessaire d' utiliser le . Voici le mien:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<StorageOptions>(Configuration.GetSection("AzureStorageConfig"));
}

Mon POCO est l' StorageOptionsobjet mentionné en haut:

namespace FictionalWebApp.Models
{
    public class StorageOptions
    {
        public String StorageConnectionString { get; set; }
        public String AccountName { get; set; }
        public String AccountKey { get; set; }
        public String DefaultEndpointsProtocol { get; set; }
        public String EndpointSuffix { get; set; }

        public StorageOptions() { }
    }
}

Et la configuration est en fait une sous-section de mon appsettings.jsonfichier, nommée AzureStorageConfig:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "AzureStorageConfig": {
    "AccountName": "fictionalwebapp",
    "AccountKey": "Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==",
    "DefaultEndpointsProtocol": "https",
    "EndpointSuffix": "core.windows.net",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  }
}

La seule chose que j'ajouterai est que, puisque le constructeur a changé, je n'ai pas testé si quelque chose de plus doit être fait pour qu'il se charge appsettings.<environmentname>.jsonpar opposition à appsettings.json.

MDMoore313
la source
Juste une note que vous devez encore lancer .AddJsonFile ("yourfile.json") à ConfigConfiguration. IE, vous devez lui indiquer où se trouve le fichier. Je n'ai pas vu ça dans la réponse.
Eric
Eric, je vais retester cela, je ne me souviens pas avoir ajouté cette ligne; Cela pourrait-il être nécessaire uniquement si le nom du fichier json n'est pas le nom par défaut?
MDMoore313
Par MSDN, il n'est pas requis pour ASPNETCORE 2.0, bien qu'il ne semble pas fonctionner pour moi non plus. docs.microsoft.com/en-us/dotnet/api/…
sam jeu
1
Je peux confirmer que j'ai dû créer un objet ConfigurationBuilder () et appeler AddJSONFile () pour charger les fichiers appSettings.json dans le dictionnaire de configuration. Il s'agit d'ASP.NET Core 2.0. Est-ce un bug car il va à l'encontre de ce que dit MSDN?
Sam Thiru
1
Pouvez-vous donner un exemple de la manière dont vous injectez StorageOptions dans vos contrôleurs? Si j'utilise l'approche hug de l'utilisation de l'injection de dépendance avec public HomeController(IOptions<StorageOptions> settings), j'obtiens ce message d'erreur: Les types complexes liés au modèle ne doivent pas être des types abstraits ou de valeur et doivent avoir un constructeur sans paramètre.
Jpsy
30

Avec .NET Core 2.2, et de la manière la plus simple possible ...

public IActionResult Index([FromServices] IConfiguration config)
{
    var myValue = config.GetValue<string>("MyKey");
}

appsettings.jsonest automatiquement chargé et disponible via le constructeur ou l'injection d'action, et il existe également une GetSectionméthode IConfiguration. Il n'est pas nécessaire de modifier Startup.csou Program.cssi tout ce dont vous avez besoin est appsettings.json.

tnJed
la source
2
encore plus simple:var myValue = config["MyKey"]
jokab
... et vous pouvez faire: config ["Storage: ConnectionString"] pour obtenir des éléments à l'intérieur du json. Je peux confirmer que cette technique fonctionne sur .net core 3 et fonctionne sur l'injection de construction.
Mário Meyrelles
29

Si vous souhaitez simplement obtenir la valeur du jeton, utilisez

Configuration["AppSettings:token"]

kodebot
la source
4
Pour que cela fonctionne, vous devez avoir préalablement initialisé une instance IConfiguration via ConfigurationBuilder.
Ε Г И І И О
20

.NET Core 3.0

Ce n'est peut-être pas le meilleur moyen d'obtenir une valeur de appsettings.json , mais c'est simple et cela fonctionne dans mon application !!

Fichier appsettings.json

{
    "ConnectionStrings": {
        "DefaultConnection":****;"
    }

    "AppSettings": {
        "APP_Name": "MT_Service",
        "APP_Version":  "1.0.0"
    }
}

Manette:

En haut :

using Microsoft.Extensions.Configuration;

Dans votre code:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];
Alexander S.
la source
Assez simple. Merci pour cela, vous m'avez aidé!
Matt
AddJsonFile n'existe pas sur ConfigurationBuilder
Essej
10

Les travaux suivants pour les applications de console;

  1. Installez les packages NuGet suivants ( .csproj);

    <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0-preview2-35157" />
    </ItemGroup>
  2. Créez appsettings.jsonau niveau racine. Faites un clic droit dessus et "Copier dans le répertoire de sortie" comme " Copier si plus récent ".

  3. Exemple de fichier de configuration:

    {
      "AppConfig": {
        "FilePath": "C:\\temp\\logs\\output.txt"
      }
    }
  4. Program.cs

    configurationSection.Keyet configurationSection.Valueaura des propriétés de configuration.

    static void Main(string[] args)
    {
        try
        {
    
            IConfigurationBuilder builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    
            IConfigurationRoot configuration = builder.Build();
            // configurationSection.Key => FilePath
            // configurationSection.Value => C:\\temp\\logs\\output.txt
            IConfigurationSection configurationSection = configuration.GetSection("AppConfig").GetSection("FilePath");
    
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
Teoman shipahi
la source
8

Pour .NET Core 2.0, vous pouvez simplement:

Déclarez vos paires clé / valeur dans appsettings.json:

{
  "MyKey": "MyValue"
}

Injectez le service de configuration dans startup.cs et obtenez la valeur à l'aide du service

using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IConfiguration configuration,
                          ... other injected services
                          )
    {
        app.Run(async (context) =>
        {
            string myValue = configuration["MyKey"];
            await context.Response.WriteAsync(myValue);
        });
Chris Halcrow
la source
8

Je doute que ce soit une bonne pratique, mais cela fonctionne localement. Je mettrai à jour cela s'il échoue lorsque je publie / déploie (vers un service Web IIS).

Étape 1 - Ajoutez cet assemblage en haut de votre classe (dans mon cas, classe de contrôleur):

using Microsoft.Extensions.Configuration;

Étape 2 - Ajoutez ceci ou quelque chose comme ça:

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

Étape 3 - Appelez la valeur de votre clé en faisant ceci (retourne une chaîne):

config["NameOfYourKey"]
Eric Milliot-Martinez
la source
je pense que cela devrait être bien à condition qu'il appsettings.jsonsoit dans le bon répertoire
Ju66ernaut
7

Juste pour compléter la réponse de Yuval Itzchakov.

Vous pouvez charger la configuration sans fonction de générateur, vous pouvez simplement l'injecter.

public IConfiguration Configuration { get; set; }

public Startup(IConfiguration configuration)
{
   Configuration = configuration;
}
Tiago Barroso
la source
6

En plus des réponses existantes, je voudrais mentionner que parfois il peut être utile d'avoir des méthodes d'extension pourIConfiguration des raisons de simplicité.

Je garde la configuration JWT dans appsettings.json donc ma classe de méthodes d'extension ressemble à ceci:

public static class ConfigurationExtensions
{
    public static string GetIssuerSigningKey(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:SecurityKey");
        return result;
    }

    public static string GetValidIssuer(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Issuer");
        return result;
    }

    public static string GetValidAudience(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Audience");
        return result;
    }

    public static string GetDefaultPolicy(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Policies:Default");
        return result;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey(this IConfiguration configuration)
    {
        var issuerSigningKey = configuration.GetIssuerSigningKey();
        var data = Encoding.UTF8.GetBytes(issuerSigningKey);
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string[] GetCorsOrigins(this IConfiguration configuration)
    {
        string[] result =
            configuration.GetValue<string>("App:CorsOrigins")
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray();

        return result;
    }
}

Cela vous fait économiser beaucoup de lignes et vous écrivez simplement du code propre et minimal:

...
x.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuerSigningKey = true,
    ValidateLifetime = true,
    IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
    ValidAudience = _configuration.GetValidAudience(),
    ValidIssuer = _configuration.GetValidIssuer()
};

Il est également possible d'enregistrer une IConfigurationinstance en tant que singleton et de l'injecter où vous en avez besoin - J'utilise le conteneur Autofac, voici comment vous le faites:

var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();

Vous pouvez faire de même avec MS Dependency Injection:

services.AddSingleton<IConfigurationRoot>(appConfiguration);
Alex Herman
la source
6

Voici le cas d'utilisation complet pour ASP.NET Core!

articles.json

{
  "shownArticlesCount": 3,
  "articles": [
    {
      "title": "My Title 1",
      "thumbnailLink": "example.com/img1.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
    {
      "title": "My Title 2",
      "thumbnailLink": "example.com/img2.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
  ]
}

ArticleContainer.cs

public class ArticleContainer
{
    public int ShownArticlesCount { get; set; }

    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Title { get; set; }

    public string ThumbnailLink { get; set; }

    public string AuthorName { get; set; }

    public string AuthorProfileLink { get; set; }

    public DateTime PublishDate { get; set; }

    public string Text { get; set; }

    public string Link { get; set; } 
}

Startup.cs

public class Startup
{
    public IConfigurationRoot ArticleConfiguration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        ArticleConfiguration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("articles.json")
            .Build();
    }

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

        services.Configure<ArticleContainer>(ArticleConfiguration);
    }
}

Index.cshtml.cs

public class IndexModel : PageModel
{
    public ArticleContainer ArticleContainer { get;set; }

    private readonly IOptions<ArticleContainer> _articleContainer;

    public IndexModel(IOptions<ArticleContainer> articleContainer)
    {
        _articleContainer = articleContainer;
    }

    public void OnGet()
    {
        ArticleContainer = _articleContainer.Value;
    }
}

Index.cshtml.cs

<h1>@Model.ArticleContainer.ShownArticlesCount</h1>
Alper Ebicoglu
la source
"ASP.NET Core" Quelle version?
Steve Smith
5

Ils ne cessent de changer les choses - après avoir mis à jour Visual Studio et avoir toute la bombe du projet, sur la voie de la récupération et la nouvelle façon de procéder ressemble à ceci:

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

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

J'ai toujours manqué cette ligne!

.SetBasePath(env.ContentRootPath)
Monolithcode
la source
1
Comment obtenir les valeurs AppSettings dans les projets de test en utilisant la même approche?
S.Siva
2
They just keep changing things. Ce. Presque toutes les réponses sur cette page ne s'appliquent qu'à une version spécifique de .Net Core.
Steve Smith
4

.NET Core 2.1.0

  1. Créez le fichier .json dans le répertoire racine
  2. Sur votre code:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. Installez les dépendances suivantes:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json

4. Ensuite, IMPORTANT: Faites un clic droit sur le fichier appsettings.json -> cliquez sur Propriétés -> sélectionnez Copier si plus récent: entrez la description de l'image ici

  1. Enfin, vous pouvez faire:

    config ["key1"]

Étant donné que mon fichier de configuration ressemblera à ceci:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}
Gregory
la source
2

Vous pouvez essayer le code ci-dessous. Cela fonctionne pour moi.

public class Settings
{
    private static IHttpContextAccessor _HttpContextAccessor;

    public Settings(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static void Configure(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static IConfigurationBuilder Getbuilder()
    {
        var builder = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json");
        return builder;
    }

    public static string GetAppSetting(string key)
    {
        //return Convert.ToString(ConfigurationManager.AppSettings[key]);
        var builder = Getbuilder();
        var GetAppStringData = builder.Build().GetValue<string>("AppSettings:" + key);
        return GetAppStringData;
    }

    public static string GetConnectionString(string key="DefaultName")
    {
        var builder = Getbuilder();
        var ConnectionString = builder.Build().GetValue<string>("ConnectionStrings:"+key);
        return ConnectionString;
    }
}

Ici, j'ai créé une classe pour obtenir la chaîne de connexion et les paramètres de l'application.

I Fichier Startup.cs dont vous avez besoin pour enregistrer la classe comme ci-dessous.

public class Startup
{

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        Settings.Configure(httpContextAccessor);
    }
}
jishan siddique
la source
2

Pour ASP.NET Core 3.1, vous pouvez suivre cette documentation:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

Lorsque vous créez un nouveau projet ASP.NET Core 3.1, vous aurez la ligne de configuration suivante dans Program.cs:

Host.CreateDefaultBuilder(args)

Cela permet les opérations suivantes:

  1. ChainedConfigurationProvider: ajoute une IConfiguration existante en tant que source. Dans le cas de la configuration par défaut, ajoute la configuration d'hôte et la définit comme première source pour la configuration de l'application.
  2. appsettings.json à l'aide du fournisseur de configuration JSON.
  3. appsettings.Environment.json à l'aide du fournisseur de configuration JSON. Par exemple, appsettings.Production.json et appsettings.Development.json.
  4. Secrets d'application lorsque l'application s'exécute dans l'environnement de développement.
  5. Variables d'environnement à l'aide du fournisseur de configuration Variables d'environnement.
  6. Arguments de ligne de commande à l'aide du fournisseur de configuration de ligne de commande.

Cela signifie que vous pouvez injecter IConfigurationet récupérer des valeurs avec une clé de chaîne, même des valeurs imbriquées. CommeIConfiguration ["Parent:Child"];

Exemple:

appsettings.json

{
  "ApplicationInsights":
    {
        "Instrumentationkey":"putrealikeyhere"
    }
}

WeatherForecast.cs

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;
    private readonly IConfiguration _configuration;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var key = _configuration["ApplicationInsights:InstrumentationKey"];

        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}
Ogglas
la source
@Ogglas ... comment l'appelant de WeatherForecastController () a pu obtenir la classe qui implémente IConfiguration?
Johnny Wu
1

Était-ce "tricher"? Je viens de rendre ma configuration dans la classe de démarrage statique, puis je peux y accéder depuis n'importe où ailleurs:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    public static IConfiguration Configuration { get; set; }
Brian Moore
la source
1

Obtenez-le dans le contrôleur en tant qu'objet via un appel Get<YourType>():

public IActionResult Index([FromServices] IConfiguration config)
{
    BillModel model = config.GetSection("Yst.Requisites").Get<BillModel>();
    return View(model);
}
Lapenkov Vladimir
la source
1

Vous devez d'abord injecter IConfiguration, puis pour lire à partir des paramètres des applications, vous pouvez utiliser l'une des méthodes suivantes:

  1. Obtenez les données d'une section

    var redisConfig = configuration.GetSection("RedisConfig");
  2. Obtenez une valeur dans une section

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. Obtenez la valeur imbriquée dans la section

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");
Hamed Naeemaei
la source
L'injection fonctionne pour les contrôleurs, mais que faire si je veux l'utiliser dans un middleware comme ici ? EG J'utilise Redis comme middleware pour mettre en cache les réponses http.
Alexander Ryan Baggett
1

La manière .NET Core 2.2

(Nul doute que Microsoft le changera à nouveau en quelque chose de complètement différent dans la prochaine version .NET.)

1. appSettings.json

Cela peut ressembler à ceci. Ici, nous allons charger Setting1 et Setting2

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Setting1": "abc",
  "Setting2": 123
}

2. AppSettings.cs

La POCO classe pour tenir Setting1 et Setting2. Nous allons charger le appsettings.json dans cet objet de classe. La structure de la classe POCO doit correspondre au fichier JSON, les propriétés peuvent être imbriquées dans d'autres propriétés / classes si vous le souhaitez.

public class AppSettings
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

3 Startup.cs

Chargez appSettings.json dans votre objet AppSettings et commencez à l'utiliser:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        AppSettings settings = new AppSettings();

        Configuration = configuration;
        configuration.Bind(settings);

        // Now start using it
        string setting1 = settings.Setting1;
        int setting2 = settings.Setting2;
    }
user1321471
la source
0

Avec la dernière itération de netcoreapp 3.1, vous pouvez le faire assez simplement sans aucune dépendance tierce.

J'ai créé un résumé pour cela , mais vous pouvez utiliser cette classe pour lire un fichier JSON et retourner des propriétés dynamiques.

using System.Text.Json;
using System.IO;

class ConfigurationLoader
{

    private dynamic configJsonData;
    public ConfigurationLoader Load(string configFilePath = "appsettings.json")
    {
        var appSettings = File.ReadAllText(configFilePath);
        this.configJsonData = JsonSerializer.Deserialize(appSettings, typeof(object));
        return this;
    }

    public dynamic GetProperty(string key)
    {
        var properties = key.Split(".");
        dynamic property = this.configJsonData;
        foreach (var prop in properties)
        {
            property = property.GetProperty(prop);
        }

        return property;
    }
}

J'ai fait cela spécifiquement pour pouvoir utiliser un appconfig.json dans mon application de console dotnet. Je viens de mettre cela dans ma Program.Mainfonction:

var config = new ConfigurationLoader();
config.Load();
Console.WriteLine(config.GetProperty("Environment.Name"));

Et cela retournera un dynamicobjet pour la propriété. (Un JsonElement si ce n'est pas une primitive). Mon appsettings.jsonfichier ressemble à ceci:

{
  "Environment": {
    "Token": "abc-123",
    "Name": "Production"
  }
}
Justin Gilman
la source