Dapatkan nilai dari appsettings.json di .net core

161

Tidak yakin apa yang saya lewatkan di sini tetapi saya tidak bisa mendapatkan nilai dari appsettings.json di aplikasi inti .net saya. Saya memiliki appsettings.json sebagai:

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

Memulai:

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

Model:

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

Pengendali:

public class HomeController : Controller
{
    private readonly AppSettings _mySettings;

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

_mySettingsselalu nol. Apakah ada sesuatu yang saya lewatkan di sini?

seorang pria
sumber
3
Silakan baca dokumentasi tentang cara menggunakan konfigurasi. Anda telah salah mengatur konfigurasi di kelas startup Anda.
colok
Terima kasih untuk dokumentasinya. Ini sangat membantu.
aman
ini bahkan dapat disederhanakan hanya dengan menggunakan injeksi ketergantungan konfigurasi IC. Yang dijelaskan di sini coding-issues.com/2018/10/...
Ranadheer Reddy

Jawaban:

228

Kelas Program dan Startup

.NET Core 2.x

Anda tidak perlu baru IConfigurationdi Startupkonstruktor. Implementasinya akan disuntikkan oleh sistem 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

Anda perlu memberitahu Startupuntuk memuat file pengaturan aplikasi.

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

Mendapatkan Nilai

Ada banyak cara Anda bisa mendapatkan nilai yang Anda konfigurasi dari pengaturan aplikasi:

  • Cara sederhana menggunakan ConfigurationBuilder.GetValue<T>
  • Menggunakan Pola Opsi

Katakanlah appsettings.jsonpenampilan Anda seperti ini:

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

Cara Sederhana

Anda dapat menyuntikkan seluruh konfigurasi ke konstruktor controller / class Anda (via IConfiguration) dan mendapatkan nilai yang Anda inginkan dengan kunci yang ditentukan:

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

Pola Opsi

Ini ConfigurationBuilder.GetValue<T>berfungsi baik jika Anda hanya membutuhkan satu atau dua nilai dari pengaturan aplikasi. Tetapi jika Anda ingin mendapatkan beberapa nilai dari pengaturan aplikasi, atau Anda tidak ingin membuat kode string yang sulit di beberapa tempat, mungkin lebih mudah untuk menggunakan Pola Opsi . Pola opsi menggunakan kelas untuk mewakili hierarki / struktur.

Untuk menggunakan pola opsi:

  1. Tentukan kelas untuk mewakili struktur
  2. Daftarkan instance konfigurasi yang diikat oleh kelas-kelas tersebut
  3. Menyuntikkan IOptions<T>ke konstruktor dari controller / class yang ingin Anda nilai

1. Tentukan kelas konfigurasi untuk mewakili struktur

Anda dapat mendefinisikan kelas dengan properti yang harus benar-benar cocok dengan tombol di pengaturan aplikasi Anda. Nama kelas tidak harus cocok dengan nama bagian dalam pengaturan aplikasi:

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. Daftarkan instance konfigurasi

Dan kemudian Anda perlu mendaftarkan instance konfigurasi ini di ConfigureServices()dalam memulai:

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. Suntikkan IOptions

Terakhir pada pengontrol / kelas yang ingin Anda nilai, Anda perlu menyuntikkan IOptions<AppIdentitySettings>melalui konstruktor:

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);
    }
}
David Liang
sumber
Bagaimana saya bisa mengakses Nilai di Kelas yang menyimpan Data saya?
Lukas Hieronimus Adler
1
@LukasHieronimusAdler: Anda mungkin ingin menggunakannya IOptionsSnapshot<T>sebagai ganti IOptions<T>. Anda dapat melihat artikel ini: offering.solutions/blog/articles/2017/02/17/… . Saya belum memiliki kesempatan untuk mencobanya sendiri.
David Liang
2
Bisakah Anda membuatnya sederhana seperti cuplikan?
Syaiful Nizam Yahya
8
Betapa langkah yang mengerikan mundur dari tumpukan penuh .net
Aaron
4
Oke, jadi untuk .NET Core 3 Anda memerlukan paket Microsoft.Extensions.Options.ConfigurationExtensions dan berfungsi dengan baik
Tomas Bruckner
50

Cukup buat file AnyName.cs dan rekatkan kode berikut.

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

Harus mengganti nama file YouAppSettingFile.json dengan nama file Anda.
File .json Anda akan terlihat seperti di bawah ini.

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

Sekarang kamu bisa menggunakannya.
Jangan lupa untuk Menambahkan Referensi di kelas Anda di tempat yang ingin Anda gunakan.

using Custom;

Kode untuk mengambil nilai.

string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];
shajji
sumber
3
Jangan gunakan ini dalam produksi. Pendekatan ini yang menyebabkan kebocoran memori di api web kami. Jika Anda menggunakan netcore, Anda dapat menyuntikkan IConfiguration secara harfiah di mana saja, lihat saja jawaban di atas.
André Mantas
49

Menambahkan ke jawaban David Liang untuk Core 2.0 -

appsettings.jsonfile terkait dengan ASPNETCORE_ENVIRONMENTvariabel.

ASPNETCORE_ENVIRONMENTdapat diatur ke nilai apapun, tapi tiga nilai-nilai yang didukung oleh kerangka kerja: Development, Staging, dan Production. Jika ASPNETCORE_ENVIRONMENTtidak disetel, defaultnya adalah Production.

Untuk ketiga nilai pengaturan aplikasi ini.ASPNETCORE_ENVIRONMENT.json file didukung di luar kotak - appsettings.Staging.json, appsettings.Development.jsondanappsettings.Production.json

Tiga pengaturan aplikasi di atas file json dapat digunakan untuk mengkonfigurasi beberapa lingkungan.

Contoh - appsettings.Staging.json

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

Gunakan Configuration["config_var"]untuk mengambil nilai konfigurasi apa pun.

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; }
}
Aseem Gautam
sumber
1
Bagaimana dengan objek bersarang?
Arthur Attout
8
Objek bersarang dapat diperoleh dengan Konfigurasi ["MyConfig: SomethingNested"]
WeHaveCookies
1
Seperti dapat dilihat di file github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/… di baris 167 ASP.NET Core saat ini memuat appsettings.json+ appsettings.{env.EnvironmentName}.json. Jadi pernyataan bahwa ASP.NET Core hanya memuat file Development, Staging, dan Production appsettings.json saat ini salah.
mvdgun
1
jadi apakah saya harus mengatur variabel Windows ASPNETCORE_ENVIRONMENTsetiap waktu? Segala sesuatunya jauh lebih mudah di .Net 4. Fanatik JSON ini benar-benar mengacaukannya
Toolkit
@Toolkit Anda dapat mengatur variabel lingkungan secara global. docs.microsoft.com/en-us/aspnet/core/fundamentals/…
Aseem Gautam
29

Saya kira cara paling sederhana adalah dengan DI. Contoh mencapai ke 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");
        ...
    }
}
Harveyt
sumber
5
Membaca jawaban lain, ini harus menjadi yang terbaik.
Harveyt
Saya hilang services.AddSingleton(Configuration);, sekarang berfungsi
Arthur Medeiros
12

Di konstruktor kelas Startup, Anda dapat mengakses appsettings.json dan banyak pengaturan lainnya menggunakan objek IConfiguration yang disuntikkan:

Pembuat Startup.cs

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;

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

    }

public IConfiguration Configuration { get; }

Isi appsettings.json

  {
  "Grandfather": {
    "Father": {
      "Child": "myvalue"
    }
  }
Shadi Namrouti
sumber
2
Sintaks 'Konfigurasi ["Kakek: Ayah: Anak"] yang membantu saya.
Jacques Olivier
2
Ini adalah jawaban yang luar biasa dalam cara terstruktur, jelas dan to the point. Komunikasi hebat
jolySoft
6
    public static void GetSection()
    {
        Configuration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json")
            .Build();

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

    }
sepideh dalirpour
sumber
4
Jawaban tidak lengkap
Carlos ABS
1

Dalam kasus saya itu sederhana seperti menggunakan metode Bind () pada objek Konfigurasi. Dan kemudian tambahkan objek sebagai singleton di DI.

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

Objek Instruksi bisa serumit yang Anda inginkan.

{  
 "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": "[email protected]",
       "CellNumber": "0833 468 378",
       "HomeNumber": "0833 468 378",
      }
      "CountryOfBirth": "710"
    }
  }
Lizo Matala
sumber
1

Untuk ASP.NET Core 3.1 Anda dapat mengikuti panduan ini:

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

Ketika Anda membuat proyek ASP.NET Core 3.1 baru Anda akan memiliki baris konfigurasi berikut Program.cs:

Host.CreateDefaultBuilder(args)

Ini memungkinkan yang berikut ini:

  1. ChainedConfigurationProvider: Menambahkan IConfiguration yang ada sebagai sumber. Dalam kasus konfigurasi default, tambahkan konfigurasi host dan atur sebagai sumber pertama untuk konfigurasi aplikasi.
  2. appsettings.json menggunakan penyedia konfigurasi JSON.
  3. appsettings.Environment.json menggunakan penyedia konfigurasi JSON. Misalnya, appsettings.Production.json dan appsettings.Development.json.
  4. Rahasia aplikasi saat aplikasi berjalan di lingkungan Pengembangan.
  5. Variabel lingkungan menggunakan penyedia konfigurasi Variabel Lingkungan.
  6. Argumen baris perintah menggunakan penyedia konfigurasi baris perintah.

Ini berarti Anda dapat menyuntikkan IConfigurationdan mengambil nilai dengan kunci string, bahkan nilai bersarang. SukaIConfiguration["Parent:Child"];

Contoh:

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
sumber
Di mana saya dapat mempelajari lebih lanjut tentang IConfiguration["Parent:Child"]sintaks?
xr280xr
0

Saya pikir pilihan terbaik adalah:

  1. Buat kelas model sebagai skema konfigurasi

  2. Daftar di DI: services.Configure (Configuration.GetSection ("democonfig"));

  3. Dapatkan nilai sebagai objek model dari DI di controller Anda:

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

Dari Asp.net core 2.2 ke atas Anda dapat kode seperti di bawah ini:

Langkah 1. Buat file kelas AppSettings.

File ini berisi beberapa metode untuk membantu mendapatkan nilai dengan kunci dari file appsettings.json. Terlihat seperti kode di bawah ini:

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

Langkah 2. Konfigurasi awal untuk objek AppSettings

Kita perlu mendeklarasikan dan memuat file appsettings.json ketika aplikasi dimulai, dan memuat informasi konfigurasi untuk objek AppSettings. Kami akan melakukan pekerjaan ini dalam konstruktor file Startup.cs. Harap perhatikan barisAppSettings.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);       
}

Oke, sekarang saya punya file appsettings.json dengan beberapa tombol seperti di bawah ini:

{
  "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": "[email protected]",
      "Pass": "123456"
    }
  }
}

Langkah 3. Baca nilai konfigurasi dari suatu tindakan

Saya membuat demo aksi di pengontrol Rumah seperti di bawah ini:

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

Dan di bawah ini hasilnya:

Klik untuk melihat hasilnya

Untuk informasi lebih lanjut, Anda bisa merujuk artikel mendapatkan nilai dari appsettings.json di asp.net core untuk kode lebih detail.

Dung Do Tien
sumber
0

Sederhana: Di appsettings.json

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

Dalam file .cs:

static IConfiguration conf = (new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build());
        public static string myValue1= conf["MyValues:Value1"].ToString();
Abhishek Pandey
sumber