Ottenere valore da appsettings.json in .net core


161

Non sono sicuro di cosa mi sto perdendo qui, ma non riesco a ottenere i valori dal mio appsettings.json nella mia applicazione core .net. Ho my appsettings.json come:

{
    "AppSettings": {
        "Version": "One"
    }
}

Avviare:

public class Startup
{
    private IConfigurationRoot _configuration;
    public Startup(IHostingEnvironment env)
    {
        _configuration = new ConfigurationBuilder()
    }
    public void ConfigureServices(IServiceCollection services)
    {
      //Here I setup to read appsettings        
      services.Configure<AppSettings>(_configuration.GetSection("AppSettings"));
    }
}

Modello:

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

controller:

public class HomeController : Controller
{
    private readonly AppSettings _mySettings;

    public HomeController(IOptions<AppSettings> settings)
    {
        //This is always null
        _mySettings = settings.Value;
    }
}

_mySettingsè sempre nullo. C'è qualcosa che mi manca qui?


3
Si prega di leggere la documentazione su come utilizzare la configurazione. Hai impostato erroneamente la configurazione nella tua classe di avvio.
colpì il

Grazie per la documentazione Questo è stato utile.
aman,

questo può anche essere semplificato semplicemente usando l'iniezione delle dipendenze di IConfiguration. Che è spiegato qui coding-issues.com/2018/10/…
Ranadheer Reddy

Risposte:


228

Programma e classe di avvio

.NET Core 2.x

Non è necessario novità IConfigurationnel Startupcostruttore. La sua implementazione verrà iniettata dal sistema DI.

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();            
}

// Startup.cs
public class Startup
{
    public IHostingEnvironment HostingEnvironment { get; private set; }
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        this.HostingEnvironment = env;
        this.Configuration = configuration;
    }
}

.NET Core 1.x

Devi dire Startupdi caricare i file delle app.

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();

        host.Run();
    }
}

//Startup.cs
public class Startup
{
    public IConfigurationRoot Configuration { get; private set; }

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

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

Ottenere valori

Esistono molti modi per ottenere il valore configurato dalle impostazioni dell'app:

  • Modo semplice usando ConfigurationBuilder.GetValue<T>
  • Utilizzo del modello opzioni

Supponiamo che appsettings.jsonassomigli a questo:

{
    "ConnectionStrings": {
        ...
    },
    "AppIdentitySettings": {
        "User": {
            "RequireUniqueEmail": true
        },
        "Password": {
            "RequiredLength": 6,
            "RequireLowercase": true,
            "RequireUppercase": true,
            "RequireDigit": true,
            "RequireNonAlphanumeric": true
        },
        "Lockout": {
            "AllowedForNewUsers": true,
            "DefaultLockoutTimeSpanInMins": 30,
            "MaxFailedAccessAttempts": 5
        }
    },
    "Recaptcha": { 
        ...
    },
    ...
}

Modo semplice

Puoi iniettare l'intera configurazione nel costruttore del tuo controller / classe (via IConfiguration) e ottenere il valore desiderato con una chiave specificata:

public class AccountController : Controller
{
    private readonly IConfiguration _config;

    public AccountController(IConfiguration config)
    {
        _config = config;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _config.GetValue<int>(
                "AppIdentitySettings:Password:RequiredLength"),
            RequireUppercase = _config.GetValue<bool>(
                "AppIdentitySettings:Password:RequireUppercase")
        };

        return View(vm);
    }
}

Modello di opzioni

La ConfigurationBuilder.GetValue<T>grandi opere se avete solo bisogno di uno o due valori dai impostazioni dell'applicazione. Ma se vuoi ottenere più valori dalle impostazioni dell'app o non vuoi codificare queste stringhe chiave in più punti, potrebbe essere più facile usare il Pattern Opzioni . Il modello di opzioni utilizza le classi per rappresentare la gerarchia / struttura.

Per utilizzare il modello opzioni:

  1. Definire le classi per rappresentare la struttura
  2. Registrare l'istanza di configurazione a cui si associano tali classi
  3. Iniettare IOptions<T>nel costruttore del controller / classe su cui si desidera ottenere valori

1. Definire le classi di configurazione per rappresentare la struttura

Puoi definire le classi con proprietà che devono corrispondere esattamente alle chiavi nelle impostazioni dell'app. Il nome della classe non deve corrispondere al nome della sezione nelle impostazioni dell'app:

public class AppIdentitySettings
{
    public UserSettings User { get; set; }
    public PasswordSettings Password { get; set; }
    public LockoutSettings Lockout { get; set; }
}

public class UserSettings
{
    public bool RequireUniqueEmail { get; set; }
}

public class PasswordSettings
{
    public int RequiredLength { get; set; }
    public bool RequireLowercase { get; set; }
    public bool RequireUppercase { get; set; }
    public bool RequireDigit { get; set; }
    public bool RequireNonAlphanumeric { get; set; }
}

public class LockoutSettings
{
    public bool AllowedForNewUsers { get; set; }
    public int DefaultLockoutTimeSpanInMins { get; set; }
    public int MaxFailedAccessAttempts { get; set; }
}

2. Registrare l'istanza di configurazione

E quindi è necessario registrare questa istanza di configurazione ConfigureServices()all'avvio:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
...

namespace DL.SO.UI.Web
{
    public class Startup
    {
        ...
        public void ConfigureServices(IServiceCollection services)
        {
            ...
            var identitySettingsSection = 
                _configuration.GetSection("AppIdentitySettings");
            services.Configure<AppIdentitySettings>(identitySettingsSection);
            ...
        }
        ...
    }
}

3. Iniettare IOpzioni

Infine sul controller / classe che si desidera ottenere i valori, è necessario iniettare IOptions<AppIdentitySettings>tramite il costruttore:

public class AccountController : Controller
{
    private readonly AppIdentitySettings _appIdentitySettings;

    public AccountController(IOptions<AppIdentitySettings> appIdentitySettingsAccessor)
    {
        _appIdentitySettings = appIdentitySettingsAccessor.Value;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _appIdentitySettings.Password.RequiredLength,
            RequireUppercase = _appIdentitySettings.Password.RequireUppercase
        };

        return View(vm);
    }
}

Come posso accedere ai valori nella classe che contiene i miei dati?
Lukas Hieronimus Adler,

1
@LukasHieronimusAdler: potresti voler usare IOptionsSnapshot<T>invece di IOptions<T>. Puoi dare un'occhiata a questo articolo: offer.solutions/blog/articles/2017/02/17/… . Non ho avuto la possibilità di provarlo da solo.
David Liang,

2
Potresti renderlo semplice come uno snippet?
Syaiful Nizam Yahya,

8
Che orribile passo indietro rispetto allo stack completo .net
Aaron,

4
Ok, quindi per .NET Core 3 hai bisogno del pacchetto Microsoft.Extensions.Options.ConfigurationExtensions e funziona bene
Tomas Bruckner,

50

Basta creare un file AnyName.cs e incollare il seguente codice.

using System;
using System.IO;
using Microsoft.Extensions.Configuration;

namespace Custom
{
    static class ConfigurationManager
    {
        public static IConfiguration AppSetting { get; }
        static ConfigurationManager()
        {
            AppSetting = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("YouAppSettingFile.json")
                    .Build();
        }
    }
}

È necessario sostituire il nome del file YouAppSettingFile.json con il nome del file.
Il tuo file .json dovrebbe apparire come di seguito.

{
    "GrandParent_Key" : {
        "Parent_Key" : {
            "Child_Key" : "value1"
        }
    },
    "Parent_Key" : {
        "Child_Key" : "value2"
    },
    "Child_Key" : "value3"
}

Ora puoi usarlo.
Non dimenticare di aggiungere riferimenti nella classe in cui si desidera utilizzare.

using Custom;

Codice per recuperare valore.

string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];

3
Non usarlo in produzione. Questo approccio ha causato perdite di memoria nella nostra API Web. Se stai usando netcore puoi iniettare IConfiguration letteralmente ovunque, vedi le risposte sopra.
André Mantas,

49

Aggiungendo alla risposta di David Liang per Core 2.0 -

appsettings.jsoni file sono collegati alla ASPNETCORE_ENVIRONMENTvariabile.

ASPNETCORE_ENVIRONMENTPuò essere impostato a qualsiasi valore, ma sono supportati tre valori dal quadro: Development, Staginge Production. Se ASPNETCORE_ENVIRONMENTnon impostato, verrà impostato automaticamente su Production.

Per questi tre valori questi appsettings.ASPNETCORE_ENVIRONMENT.json file sono supportati fuori dalla scatola - appsettings.Staging.json, appsettings.Development.jsoneappsettings.Production.json

I tre file json di impostazione dell'applicazione sopra indicati possono essere utilizzati per configurare più ambienti.

Esempio - appsettings.Staging.json

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "MyConfig": "My Config Value for staging."
}

Utilizzare Configuration["config_var"]per recuperare qualsiasi valore di configurazione.

public class Startup
{
    public Startup(IHostingEnvironment env, IConfiguration config)
    {
        Environment = env;
        Configuration = config;
        var myconfig = Configuration["MyConfig"];
    }

    public IConfiguration Configuration { get; }
    public IHostingEnvironment Environment { get; }
}

1
Che dire degli oggetti nidificati?
Arthur Attout,

8
Gli oggetti nidificati possono essere ottenuti con Configuration ["MyConfig: SomethingNested"]
WeHaveCookies

1
Come si può vedere nel file github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/… alla riga 167 ASP.NET Core attualmente carica appsettings.json+ appsettings.{env.EnvironmentName}.json. Pertanto, l'affermazione secondo cui ASP.NET Core carica solo i file appsettings.json di sviluppo, gestione temporanea e produzione è attualmente errata.
mvdgun

1
quindi dovrei impostare ASPNETCORE_ENVIRONMENTogni volta la variabile di Windows ? Le cose erano molto più facili in .Net 4. Questi fanatici di JSON hanno fatto un casino alla grande
Toolkit

@Toolkit È possibile impostare la variabile d'ambiente a livello globale. docs.microsoft.com/en-us/aspnet/core/fundamentals/…
Aseem Gautam

29

Immagino che il modo più semplice sia di DI. Un esempio di come raggiungere Controller.

// StartUp.cs
public void ConfigureServices(IServiceCollection services)
{
    ...
    // for get appsettings from anywhere
    services.AddSingleton(Configuration);
}

public class ContactUsController : Controller
{
    readonly IConfiguration _configuration;

    public ContactUsController(
        IConfiguration configuration)
    {
        _configuration = configuration;

        // sample:
        var apiKey = _configuration.GetValue<string>("SendGrid:CAAO");
        ...
    }
}

5
Leggendo le altre risposte, questo dovrebbe essere il migliore.
Harveyt,

Mi mancava services.AddSingleton(Configuration);, ora funziona
Arthur Medeiros l'

12

Nel costruttore della classe Startup, puoi accedere a appsettings.json e molte altre impostazioni usando l'oggetto IConfiguration iniettato:

Costruttore Startup.cs

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;

        //here you go
        var myvalue = Configuration["Grandfather:Father:Child"];

    }

public IConfiguration Configuration { get; }

Contenuto di appsettings.json

  {
  "Grandfather": {
    "Father": {
      "Child": "myvalue"
    }
  }

2
È stata la sintassi 'Configuration ["Grandfather: Father: Child"]' che mi ha aiutato.
Jacques Olivier,

2
Questa è una risposta eccezionale nel modo in cui è strutturata, chiara e precisa. Ottima comunicazione
jolySoft il

6
    public static void GetSection()
    {
        Configuration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json")
            .Build();

        string BConfig = Configuration.GetSection("ConnectionStrings")["BConnection"];

    }

4
Risposta incompleta
Carlos ABS,

1

Nel mio caso era semplice come usare il metodo Bind () sull'oggetto Configuration. E quindi aggiungere l'oggetto come singleton nella DI.

var instructionSettings = new InstructionSettings();
Configuration.Bind("InstructionSettings", instructionSettings);
services.AddSingleton(typeof(IInstructionSettings), (serviceProvider) => instructionSettings);

L'oggetto Istruzione può essere complesso quanto vuoi.

{  
 "InstructionSettings": {
    "Header": "uat_TEST",
    "SVSCode": "FICA",
    "CallBackUrl": "https://UATEnviro.companyName.co.za/suite/webapi/receiveCallback",
    "Username": "s_integrat",
    "Password": "X@nkmail6",
    "Defaults": {
    "Language": "ENG",
    "ContactDetails":{
       "StreetNumber": "9",
       "StreetName": "Nano Drive",
       "City": "Johannesburg",
       "Suburb": "Sandton",
       "Province": "Gauteng",
       "PostCode": "2196",
       "Email": "ourDefaultEmail@companyName.co.za",
       "CellNumber": "0833 468 378",
       "HomeNumber": "0833 468 378",
      }
      "CountryOfBirth": "710"
    }
  }

1

Per ASP.NET Core 3.1 puoi seguire questa guida:

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

Quando si crea un nuovo progetto ASP.NET Core 3.1, si avrà la seguente riga di configurazione in Program.cs:

Host.CreateDefaultBuilder(args)

Ciò consente quanto segue:

  1. ChainedConfigurationProvider: aggiunge una configurazione esistente come sorgente. Nel caso della configurazione predefinita, aggiunge la configurazione dell'host e la imposta come prima fonte per la configurazione dell'app.
  2. appsettings.json utilizzando il provider di configurazione JSON.
  3. appsettings.Environment.json utilizzando il provider di configurazione JSON. Ad esempio, appsettings.Production.json e appsettings.Development.json.
  4. Segreti dell'app quando l'app viene eseguita nell'ambiente di sviluppo.
  5. Variabili d'ambiente usando il provider di configurazione Variabili d'ambiente.
  6. Argomenti della riga di comando utilizzando il provider di configurazione della riga di comando.

Ciò significa che è possibile iniettare IConfiguratione recuperare valori con una chiave stringa, anche con valori nidificati. PiaceIConfiguration["Parent:Child"];

Esempio:

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();
    }
}

Dove posso saperne di più sulla IConfiguration["Parent:Child"]sintassi?
xr280xr

0

Penso che l'opzione migliore sia:

  1. Creare una classe di modello come schema di configurazione

  2. Registrati in DI: services.Configure (Configuration.GetSection ("democonfig"));

  3. Ottieni i valori come oggetto modello da DI nel tuo controller:

    private readonly your_model myConfig;
    public DemoController(IOptions<your_model> configOps)
    {
        this.myConfig = configOps.Value;
    }

0

Da Asp.net core 2.2 in poi puoi scrivere il codice come di seguito:

Passaggio 1. Creare un file di classe AppSettings.

Questo file contiene alcuni metodi per aiutare a ottenere valore dalla chiave dal file appsettings.json. Assomiglia al seguente codice:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ReadConfig.Bsl
{
  public class AppSettings
  {
      private static AppSettings _instance;
      private static readonly object ObjLocked = new object();
      private IConfiguration _configuration;

      protected AppSettings()
      {
      }

      public void SetConfiguration(IConfiguration configuration)
      {
          _configuration = configuration;
      }

      public static AppSettings Instance
      {
          get
          {
              if (null == _instance)
              {
                  lock (ObjLocked)
                  {
                      if (null == _instance)
                          _instance = new AppSettings();
                  }
              }
              return _instance;
          }
      }

      public string GetConnection(string key, string defaultValue = "")
      {
          try
          {
              return _configuration.GetConnectionString(key);
          }
          catch
          {
              return defaultValue;
          }
      }

      public T Get<T>(string key = null)
      {
          if (string.IsNullOrWhiteSpace(key))
              return _configuration.Get<T>();
          else
              return _configuration.GetSection(key).Get<T>();
      }

      public T Get<T>(string key, T defaultValue)
      {
          if (_configuration.GetSection(key) == null)
              return defaultValue;

          if (string.IsNullOrWhiteSpace(key))
              return _configuration.Get<T>();
          else
              return _configuration.GetSection(key).Get<T>();
      }

      public static T GetObject<T>(string key = null)
      {
          if (string.IsNullOrWhiteSpace(key))
              return Instance._configuration.Get<T>();
          else
          {
              var section = Instance._configuration.GetSection(key);
              return section.Get<T>();
          }
      }

      public static T GetObject<T>(string key, T defaultValue)
      {
          if (Instance._configuration.GetSection(key) == null)
              return defaultValue;

          if (string.IsNullOrWhiteSpace(key))
              return Instance._configuration.Get<T>();
          else
              return Instance._configuration.GetSection(key).Get<T>();
      }
  }
}

Passaggio 2. Configurazione iniziale per l'oggetto AppSettings

Dobbiamo dichiarare e caricare il file appsettings.json all'avvio dell'applicazione e caricare le informazioni di configurazione per l'oggetto AppSettings. Faremo questo lavoro nel costruttore del file Startup.cs. Si prega di notare la lineaAppSettings.Instance.SetConfiguration(Configuration);

public Startup(IHostingEnvironment evm)
{
    var builder = new ConfigurationBuilder()
      .SetBasePath(evm.ContentRootPath)
      .AddJsonFile("appsettings.json", true, true)
      .AddJsonFile($"appsettings.{evm.EnvironmentName}.json", true)
      .AddEnvironmentVariables();
    Configuration = builder.Build(); // load all file config to Configuration property 
    AppSettings.Instance.SetConfiguration(Configuration);       
}

Bene, ora ho un file appsettings.json con alcuni tasti come di seguito:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "ConnectionString": "Data Source=localhost;Initial Catalog=ReadConfig;Persist Security Info=True;User ID=sa;Password=12345;"
  },
  "MailConfig": {
    "Servers": {
      "MailGun": {
        "Pass": "65-1B-C9-B9-27-00",
        "Port": "587",
        "Host": "smtp.gmail.com"
      }
    },
    "Sender": {
      "Email": "example@gmail.com",
      "Pass": "123456"
    }
  }
}

Passaggio 3. Leggere il valore di configurazione da un'azione

Faccio demo un'azione nel controller Home come di seguito:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var connectionString = AppSettings.Instance.GetConnection("ConnectionString");
        var emailSender = AppSettings.Instance.Get<string>("MailConfig:Sender:Email");
        var emailHost = AppSettings.Instance.Get<string>("MailConfig:Servers:MailGun:Host");

        string returnText = " 1. Connection String \n";
        returnText += "  " +connectionString;
        returnText += "\n 2. Email info";
        returnText += "\n Sender : " + emailSender;
        returnText += "\n Host : " + emailHost;

        return Content(returnText);
    }
}

E di seguito è riportato il risultato:

Clicca per vedere il risultato

Per ulteriori informazioni, è possibile fare riferimento all'articolo ottenere valore da appsettings.json nel core asp.net per ulteriori dettagli.


0

È semplice: in appsettings.json

  "MyValues": {
    "Value1": "Xyz"
  }

Nel file .cs:

static IConfiguration conf = (new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build());
        public static string myValue1= conf["MyValues:Value1"].ToString();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.