Cara membaca nilai AppSettings dari file .json di ASP.NET Core

247

Saya telah mengatur data AppSettings saya dalam pengaturan file aplikasi / Konfigurasi .json seperti ini:

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

Saya telah mencari secara online tentang cara membaca nilai AppSettings dari file .json, tapi saya tidak bisa mendapatkan sesuatu yang bermanfaat.

Saya mencoba:

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

Saya tahu dengan ASP.NET 4.0 Anda bisa melakukan ini:

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

Tetapi bagaimana saya melakukan ini di ASP.NET Core?

Oluwafemi
sumber
ini bahkan dapat disederhanakan hanya dengan menggunakan injeksi dependensi IConfiguration (dalam .net core 2.0). Yang dijelaskan di sini coding-issues.com/2018/10/...
Ranadheer Reddy
@RanadheerReddy, injeksi ketergantungan bekerja untuk pengontrol. Tetapi bagaimana jika seseorang perlu membaca nilai di Middleware?
Alexander Ryan Baggett

Jawaban:

319

Ini telah memiliki beberapa tikungan dan belokan. Saya telah memodifikasi jawaban ini agar mutakhir dengan ASP.NET Core 2.0 (per 26/02/2018).

Ini sebagian besar diambil dari dokumentasi resmi :

Untuk bekerja dengan pengaturan di aplikasi ASP.NET Anda, disarankan agar Anda hanya instantiate Configurationdi Startupkelas aplikasi Anda . Kemudian, gunakan pola Opsi untuk mengakses pengaturan individual. Katakanlah kita memiliki appsettings.jsonfile yang terlihat seperti ini:

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

}

Dan kami memiliki objek POCO yang mewakili konfigurasi:

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

Sekarang kita membangun konfigurasi di 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();
    }
}

Catatan yang appsettings.jsonakan didaftarkan secara default di .NET Core 2.0. Kami juga dapat mendaftarkan appsettings.{Environment}.jsonfile konfigurasi per lingkungan jika diperlukan.

Jika kami ingin menyuntikkan konfigurasi kami ke pengontrol kami, kami harus mendaftarkannya dengan runtime. Kami melakukannya melalui 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"));
}

Dan kami menyuntikkannya seperti ini:

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

Kelas lengkap Startup:

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
sumber
3
versi "1.0.0-beta4"bekerja pada milikku tidak "1.0.0-alpha4". Terima kasih banyak!
Oluwafemi
2
Saya perlu meneruskan pengaturan ke lapisan lain dari kelas utilitas jadi saya memerlukan sesuatu seperti string statis publik GetConnectionString () {if (string.IsNullOrEmpty (connectionString)) {var builder = new ConfigurationBuilder () .AddJsonFile ("config.json "); Konfigurasi = builder.Build (); connectionString = Configuration.Get ("Data: DefaultConnection: ConnectionString"); }} return connectionString; }
dnxit
2
Saya dapatArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
Peter
5
Setelah menambahkan nuget Microsoft.Extensions.Options.ConfigurationExtensionsitu berfungsi seperti yang diharapkan.
Peter
2
Penjelasan yang bagus tentang logika proses config, tetapi melewatkan poin utama: SetBasePath () dan AddJsonFile () adalah metode ekstensi, sangat banyak digunakan dalam kerangka kerja di majelis terpisah. Jadi untuk memulai, kita perlu menginstal Microsoft.Extensions.Configuration.FileExtensions dan Microsoft.Extensions.Configuration.Json di samping Microsoft.Extensions.Configuration.
Bozhidar Stoyneff
63

Pertama: Nama perakitan dan namespace Microsoft.Framework.ConfigurationModel telah berubah menjadi Microsoft.Framework.Configuration. Jadi, Anda harus menggunakan: misalnya

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

sebagai ketergantungan pada project.json. Gunakan beta5 atau 6 jika Anda belum menginstalnya. Kemudian Anda dapat melakukan sesuatu seperti dalam hal ini 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();
}

Jika Anda ingin mengambil variabel dari config.json, Anda bisa langsung menggunakan:

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

atau Anda dapat membuat kelas yang disebut AppSettings seperti ini:

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

dan konfigurasikan layanan seperti ini:

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

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

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

dan kemudian mengaksesnya melalui misalnya pengontrol seperti ini:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}
memeluk
sumber
dapatkah Anda berbagi konfigurasi json untuk "AppSettings" untuk referensi
Ankit Mori
Saya membutuhkan seluruh konfigurasi appSettings.json di kelas, untuk ini, saya telah mendesain kelas sesuai JSON dan menggunakannya Configuration.Get<AppSettings>()untuk menghapus seluruh file bukan bagian tertentu.
Nilay
52

Untuk .NET Core 2.0, segalanya telah berubah sedikit. Konstruktor startup mengambil objek Konfigurasi sebagai parameter, Jadi ConfigurationBuildertidak diperlukan menggunakan. Ini milik saya:

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

POCO saya adalah StorageOptionsobjek yang disebutkan di atas:

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

Dan konfigurasinya sebenarnya adalah subbagian dari appsettings.jsonfile saya , bernama 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"
  }
}

Satu-satunya hal yang akan saya tambahkan adalah, karena konstruktor telah berubah, saya belum menguji apakah perlu dilakukan sesuatu tambahan untuk memuatnya appsettings.<environmentname>.jsonsebagai lawan appsettings.json.

MDMoore313
sumber
Hanya sebuah catatan bahwa Anda masih perlu melemparkan .AddJsonFile ("yourfile.json") ke ConfigConfiguration. Yaitu, Anda harus memberi tahu di mana file tersebut berada. Tidak melihat itu dalam jawabannya.
Eric
Eric saya akan menguji ulang itu, saya tidak ingat menambahkan baris itu; Mungkinkah itu perlu hanya jika nama file json bukan nama default?
MDMoore313
Per MSDN, itu tidak diperlukan untuk ASPNETCORE 2.0, meskipun tampaknya tidak berfungsi untuk saya juga. docs.microsoft.com/en-us/dotnet/api/…
Sat Thiru
1
Saya dapat mengonfirmasi bahwa saya harus membuat objek ConfigurationBuilder () dan memanggil AddJSONFile () untuk memuat file appSettings.json ke dalam kamus konfigurasi. Ini adalah ASP.NET Core 2.0. Apakah ini bug karena bertentangan dengan apa yang dikatakan MSDN?
Sab Thiru
1
Bisakah Anda memberi contoh bagaimana Anda menyuntikkan StorageOptions ke controller Anda? Jika saya menggunakan pendekatan pelukan menggunakan injeksi ketergantungan public HomeController(IOptions<StorageOptions> settings), saya mendapatkan pesan kesalahan ini: Tipe kompleks model terikat tidak boleh abstrak atau tipe nilai dan harus memiliki konstruktor tanpa parameter.
Jpsy
30

Dengan .NET Core 2.2, dan dengan cara sesederhana mungkin ...

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

appsettings.jsonsecara otomatis dimuat dan tersedia baik melalui konstruktor atau injeksi tindakan, dan ada GetSectionmetode IConfigurationjuga. Tidak perlu mengubah Startup.csatau Program.csjika semua yang Anda butuhkan adalah appsettings.json.

tnJed
sumber
2
lebih sederhana:var myValue = config["MyKey"]
jokab
... dan Anda dapat melakukan: config ["Storage: ConnectionString"] untuk mendapatkan elemen di dalam json. Saya dapat mengkonfirmasi teknik ini berfungsi pada .net core 3 dan bekerja pada injeksi konstruksi.
Mário Meyrelles
29

Jika Anda hanya ingin mendapatkan nilai token lalu gunakan

Configuration["AppSettings:token"]

Kodebot
sumber
4
Agar ini berfungsi, Anda harus memiliki instance IConfiguration yang diinisialisasi melalui ConfigurationBuilder sebelumnya.
Ε Г И І И О
20

.NET Core 3.0

Mungkin itu bukan cara terbaik untuk mendapatkan nilai dari appsettings.json , tetapi sederhana dan berfungsi di aplikasi saya !!

File appsettings.json

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

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

Pengendali:

Di atas :

using Microsoft.Extensions.Configuration;

Dalam kode Anda:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];
Alexander S.
sumber
Cukup mudah. Terima kasih untuk ini, Anda membantu saya!
Mat
AddJsonFile tidak ada di ConfigurationBuilder
Essej
10

Berikut ini berfungsi untuk aplikasi konsol;

  1. Instal paket NuGet berikut ( .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. Buat appsettings.jsondi tingkat root. Klik kanan padanya dan "Salin ke Direktori Keluaran" sebagai " Salin jika lebih baru ".

  3. File konfigurasi sampel:

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

    configurationSection.Keydan configurationSection.Valueakan memiliki properti konfigurasi.

    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
sumber
8

Untuk .NET Core 2.0, Anda cukup:

Nyatakan pasangan kunci / nilai Anda di appsettings.json:

{
  "MyKey": "MyValue"
}

Suntikkan layanan konfigurasi di startup.cs, dan dapatkan nilai menggunakan layanan

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
sumber
8

Saya ragu ini adalah praktik yang baik tetapi ini bekerja secara lokal. Saya akan memperbarui ini jika gagal ketika saya mempublikasikan / menyebarkan (ke layanan web IIS).

Langkah 1 - Tambahkan perakitan ini ke bagian atas kelas Anda (dalam kasus saya, kelas controller):

using Microsoft.Extensions.Configuration;

Langkah 2 - Tambahkan ini atau sesuatu seperti itu:

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

Langkah 3 - Panggil nilai kunci Anda dengan melakukan ini (mengembalikan string):

config["NameOfYourKey"]
Eric Milliot-Martinez
sumber
Saya pikir ini harus baik-baik saja asalkan appsettings.jsonada di direktori yang benar
Ju66ernaut
7

Hanya untuk melengkapi jawaban Yuval Itzchakov.

Anda dapat memuat konfigurasi tanpa fungsi pembangun, Anda bisa menyuntikkannya.

public IConfiguration Configuration { get; set; }

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

Selain jawaban yang ada saya ingin menyebutkan bahwa kadang-kadang hal ini mungkin berguna untuk memiliki metode ekstensi untuk IConfigurationuntuk mudahnya.

Saya menyimpan JWT config di appsettings.json sehingga kelas metode ekstensi saya terlihat sebagai berikut:

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

Ini menghemat banyak baris dan Anda hanya menulis kode bersih dan minimal:

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

Anda juga dapat mendaftarkan IConfigurationinstance sebagai singleton dan menyuntikkannya di mana pun Anda butuhkan - Saya menggunakan wadah Autofac berikut cara melakukannya:

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

Anda dapat melakukan hal yang sama dengan Injeksi Ketergantungan MS:

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

Inilah kasus penggunaan penuh untuk 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
sumber
"ASP.NET Core" Versi apa?
Steve Smith
5

Mereka terus mengubah hal-hal - baru saja memperbarui Visual Studio dan memiliki seluruh proyek bom, di jalan menuju pemulihan dan cara baru terlihat seperti ini:

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

Saya terus melewatkan baris ini!

.SetBasePath(env.ContentRootPath)
Kode monolit
sumber
1
Bagaimana kita bisa mendapatkan nilai AppSettings di Proyek Uji menggunakan pendekatan yang sama?
S.Siva
2
They just keep changing things. Ini. Hampir setiap jawaban pada halaman ini hanya berlaku untuk versi tertentu .Net Core.
Steve Smith
4

.NET Core 2.1.0

  1. Buat file .json pada direktori root
  2. Pada kode Anda:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. Instal dependensi berikut:

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

4. Kemudian, PENTING: Klik kanan pada file appsettings.json -> klik Properties -> pilih Copy jika yang lebih baru: masukkan deskripsi gambar di sini

  1. Akhirnya, Anda dapat melakukan:

    config ["key1"]

Menimbang bahwa file konfigurasi saya akan terlihat seperti ini:

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

Anda dapat mencoba kode di bawah ini. Ini bekerja untuk saya.

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

Di sini saya telah membuat satu kelas untuk mendapatkan string koneksi dan pengaturan aplikasi.

Saya file Startup.cs Anda harus mendaftar kelas seperti di bawah ini.

public class Startup
{

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

Untuk ASP.NET Core 3.1 Anda dapat mengikuti dokumentasi 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:

  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
@ Ogglas ... bagaimana penelepon WeatherForecastController () dapat memperoleh kelas yang mengimplementasikan IConfiguration?
Johnny Wu
1

Apakah ini "curang"? Saya baru saja membuat Konfigurasi saya di kelas Startup statis, dan kemudian saya dapat mengaksesnya dari tempat lain:

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
sumber
1

Dapatkan di dalam pengontrol sebagai objek melalui panggilan Get<YourType>():

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

Pertama Anda harus menyuntikkan konfigurasi IC dan kemudian untuk membaca dari pengaturan aplikasi, Anda dapat menggunakan salah satu metode ini:

  1. Dapatkan data bagian

    var redisConfig = configuration.GetSection("RedisConfig");
  2. Dapatkan nilai dalam bagian

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. Dapatkan nilai bersarang di dalam bagian

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");
Hamed Naeemaei
sumber
Injeksi berfungsi untuk pengendali, tetapi bagaimana jika saya ingin menggunakannya di Middleware seperti di sini ? EG Saya menggunakan Redis sebagai middleware untuk menyimpan tanggapan http.
Alexander Ryan Baggett
1

Cara .NET Core 2.2

(Tidak diragukan Microsoft akan mengubahnya lagi menjadi sesuatu yang sama sekali berbeda di versi .NET berikutnya.)

1. appSettings.json

Mungkin terlihat seperti ini. Di sini kita akan memuat Setting1 dan Setting2

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

2. AppSettings.cs

Kelas POCO untuk mengadakan Setting1 dan Setting2. Kami akan memuat appsettings.json ke objek kelas ini. Struktur kelas POCO harus sesuai dengan file JSON, properti dapat bersarang di dalam properti / kelas lain jika diinginkan.

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

3 Startup.cs

Muat appSettings.json ke dalam Anda objek AppSettings dan mulai menggunakannya:

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;
    }
pengguna1321471
sumber
0

Dengan iterasi terbaru dari netcoreapp 3.1, Anda dapat melakukannya dengan mudah tanpa ketergantungan pihak ketiga.

Saya membuat intisari untuk ini , tetapi Anda bisa menggunakan kelas ini untuk membaca file JSON dan mengembalikan properti dinamis.

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

Saya secara khusus membuat ini sehingga saya bisa menggunakan appconfig.json di aplikasi konsol dotnet saya. Saya hanya menempatkan ini di Program.Mainfungsi saya :

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

Dan ini akan mengembalikan dynamicobjek untuk properti. (A JsonElement jika itu bukan primitif). appsettings.jsonFile saya terlihat seperti ini:

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