Bagikan melalui


Penyedia konfigurasi di .NET

Konfigurasi di .NET dimungkinkan dengan penyedia konfigurasi. Beberapa jenis penyedia mengandalkan berbagai sumber konfigurasi. Artikel ini merinci semua penyedia konfigurasi yang berbeda dan sumber yang sesuai.

Penyedia konfigurasi file

FileConfigurationProvider adalah kelas dasar untuk memuat konfigurasi dari sistem file. Penyedia konfigurasi berikut berasal dari FileConfigurationProvider:

Kunci tidak peka huruf besar/kecil. Semua penyedia konfigurasi file melemparkan FormatException ketika kunci duplikat ditemukan dalam satu penyedia.

Penyedia konfigurasi JSON

Kelas JsonConfigurationProvider memuat konfigurasi dari file JSON. Microsoft.Extensions.Configuration.Json Instal paket NuGet.

Kelebihan beban dapat menentukan:

  • Apakah file bersifat opsional.
  • Apakah konfigurasi dimuat ulang jika file berubah.

Pertimbangkan gambar berikut:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using ConsoleJson.Example;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Configuration.Sources.Clear();

IHostEnvironment env = builder.Environment;

builder.Configuration
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);

TransientFaultHandlingOptions options = new();
builder.Configuration.GetSection(nameof(TransientFaultHandlingOptions))
    .Bind(options);

Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}");
Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}");

using IHost host = builder.Build();

// Application code should start here.

await host.RunAsync();

Kode sebelumnya:

  • Menghapus semua penyedia konfigurasi yang ada yang ditambahkan secara default dalam CreateApplicationBuilder(String[]) metode .
  • Mengonfigurasi penyedia konfigurasi JSON untuk memuat appsettings.json dan appsettings.Environment.file json dengan opsi berikut:
    • optional: true: File bersifat opsional.
    • reloadOnChange: true: File dimuat ulang saat perubahan disimpan.

Penting

Saat menambahkan penyedia konfigurasi dengan IConfigurationBuilder.Add, penyedia konfigurasi tambahan ditambahkan ke akhir IConfigurationSource daftar. Ketika kunci ditemukan oleh beberapa penyedia, penyedia terakhir untuk membaca kunci mengambil alih penyedia sebelumnya.

Contoh file appsettings.json dengan berbagai pengaturan konfigurasi berikut:

{
    "SecretKey": "Secret key value",
    "TransientFaultHandlingOptions": {
        "Enabled": true,
        "AutoRetryDelay": "00:00:07"
    },
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    }
}

IConfigurationBuilder Dari instans, setelah penyedia konfigurasi ditambahkan, Anda dapat memanggil IConfigurationBuilder.Build() untuk mendapatkan IConfigurationRoot objek. Akar konfigurasi mewakili akar hierarki konfigurasi. Bagian dari konfigurasi dapat terikat ke instans objek .NET dan kemudian disediakan sebagai IOptions<TOptions> melalui injeksi dependensi.

Catatan

Properti Tindakan Build dan Salin ke Direktori Output file JSON harus diatur ke Konten dan Salin jika lebih baru (atau Salin selalu).

Pertimbangkan kelas yang TransientFaultHandlingOptions didefinisikan sebagai berikut:

namespace ConsoleJson.Example;

public sealed class TransientFaultHandlingOptions
{
    public bool Enabled { get; set; }
    public TimeSpan AutoRetryDelay { get; set; }
}

Kode berikut membangun akar konfigurasi, mengikat bagian ke TransientFaultHandlingOptions jenis kelas, dan mencetak nilai terikat ke jendela konsol:

TransientFaultHandlingOptions options = new();
builder.Configuration.GetSection(nameof(TransientFaultHandlingOptions))
    .Bind(options);

Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}");
Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}");

Aplikasi menulis contoh output berikut:

// Sample output:
//    TransientFaultHandlingOptions.Enabled=True
//    TransientFaultHandlingOptions.AutoRetryDelay=00:00:07

Penyedia konfigurasi XML

Kelas XmlConfigurationProvider memuat konfigurasi dari file XML pada waktu proses. Microsoft.Extensions.Configuration.Xml Instal paket NuGet.

Kode berikut menunjukkan konfigurasi file XML menggunakan penyedia konfigurasi XML.

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Configuration.Sources.Clear();

builder.Configuration
    .AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true)
    .AddXmlFile("repeating-example.xml", optional: true, reloadOnChange: true);

builder.Configuration.AddEnvironmentVariables();

if (args is { Length: > 0 })
{
    builder.Configuration.AddCommandLine(args);
}

using IHost host = builder.Build();

// Application code should start here.

await host.RunAsync();

Kode sebelumnya:

  • Menghapus semua penyedia konfigurasi yang ada yang ditambahkan secara default dalam CreateApplicationBuilder(String[]) metode .
  • Mengonfigurasi penyedia konfigurasi XML untuk memuat file appsettings.xml dan repeating-example.xml dengan opsi berikut:
    • optional: true: File bersifat opsional.
    • reloadOnChange: true: File dimuat ulang saat perubahan disimpan.
  • Mengonfigurasi penyedia konfigurasi variabel lingkungan.
  • Mengonfigurasi penyedia konfigurasi baris perintah jika yang diberikan args berisi argumen.

Pengaturan XML ditimpa oleh pengaturan di penyedia konfigurasi variabel Lingkungan dan penyedia konfigurasi Baris perintah.

Contoh file appsettings.xml dengan berbagai pengaturan konfigurasi berikut:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <SecretKey>Secret key value</SecretKey>
  <TransientFaultHandlingOptions>
    <Enabled>true</Enabled>
    <AutoRetryDelay>00:00:07</AutoRetryDelay>
  </TransientFaultHandlingOptions>
  <Logging>
    <LogLevel>
      <Default>Information</Default>
      <Microsoft>Warning</Microsoft>
    </LogLevel>
  </Logging>
</configuration>

Tip

Untuk menggunakan IConfiguration jenis di aplikasi WinForms, tambahkan referensi ke paket NuGet Microsoft.Extensions.Configuration.Xml . Buat instans ConfigurationBuilder panggilan rantai dan ke AddXmlFile dan Build(). Untuk informasi selengkapnya, lihat Masalah Dokumen .NET #29679.

Di .NET 5 dan versi yang lebih lama, tambahkan name atribut untuk membedakan elemen berulang yang menggunakan nama elemen yang sama. Di .NET 6 dan versi yang lebih baru, penyedia konfigurasi XML secara otomatis mengindeks elemen berulang. Itu berarti Anda tidak perlu menentukan name atribut, kecuali jika Anda menginginkan indeks "0" di kunci dan hanya ada satu elemen. (Jika Anda memutakhirkan ke .NET 6 atau yang lebih baru, Anda mungkin mengalami jeda yang dihasilkan dari perubahan perilaku ini. Untuk informasi selengkapnya, lihat Elemen XML berulang menyertakan indeks.)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <section name="section0">
    <key name="key0">value 00</key>
    <key name="key1">value 01</key>
  </section>
  <section name="section1">
    <key name="key0">value 10</key>
    <key name="key1">value 11</key>
  </section>
</configuration>

Kode berikut membaca file konfigurasi sebelumnya dan menampilkan kunci dan nilai:

IConfigurationRoot configurationRoot = builder.Configuration;

string key00 = "section:section0:key:key0";
string key01 = "section:section0:key:key1";
string key10 = "section:section1:key:key0";
string key11 = "section:section1:key:key1";

string? val00 = configurationRoot[key00];
string? val01 = configurationRoot[key01];
string? val10 = configurationRoot[key10];
string? val11 = configurationRoot[key11];

Console.WriteLine($"{key00} = {val00}");
Console.WriteLine($"{key01} = {val01}");
Console.WriteLine($"{key10} = {val10}");
Console.WriteLine($"{key10} = {val11}");

Aplikasi akan menulis output sampel berikut:

// Sample output:
//    section:section0:key:key0 = value 00
//    section:section0:key:key1 = value 01
//    section:section1:key:key0 = value 10
//    section:section1:key:key0 = value 11

Atribut dapat digunakan untuk menyediakan nilai:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <key attribute="value" />
  <section>
    <key attribute="value" />
  </section>
</configuration>

File konfigurasi sebelumnya memuat kunci berikut dengan value:

  • key:attribute
  • section:key:attribute

Penyedia konfigurasi INI

Kelas IniConfigurationProvider memuat konfigurasi dari file INI pada waktu proses. Microsoft.Extensions.Configuration.Ini Instal paket NuGet.

Kode berikut menghapus semua penyedia konfigurasi dan menambahkan IniConfigurationProvider dengan dua file INI sebagai sumbernya:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Configuration.Sources.Clear();

IHostEnvironment env = builder.Environment;

builder.Configuration
    .AddIniFile("appsettings.ini", optional: true, reloadOnChange: true)
    .AddIniFile($"appsettings.{env.EnvironmentName}.ini", true, true);

using IHost host = builder.Build();

// Application code should start here.

await host.RunAsync();

Contoh file appsettings.ini dengan berbagai pengaturan konfigurasi berikut:

SecretKey="Secret key value"

[TransientFaultHandlingOptions]
Enabled=True
AutoRetryDelay="00:00:07"

[Logging:LogLevel]
Default=Information
Microsoft=Warning

Kode berikut menampilkan pengaturan konfigurasi sebelumnya dengan menulisnya ke jendela konsol:

foreach ((string key, string? value) in
    builder.Configuration.AsEnumerable().Where(t => t.Value is not null))
{
    Console.WriteLine($"{key}={value}");
}

Aplikasi akan menulis output sampel berikut:

// Sample output:
//    TransientFaultHandlingOptions:Enabled=True
//    TransientFaultHandlingOptions:AutoRetryDelay=00:00:07
//    SecretKey=Secret key value
//    Logging:LogLevel:Microsoft=Warning
//    Logging:LogLevel:Default=Information

Penyedia konfigurasi variabel lingkungan

Menggunakan konfigurasi default, EnvironmentVariablesConfigurationProvider memuat konfigurasi dari pasangan nilai kunci variabel lingkungan setelah membaca appsettings.json, appsettings.Environment. json, dan Manajer rahasia. Oleh karena itu, nilai kunci yang dibaca dari lingkungan mengambil alih nilai yang dibaca dari appsettings.json, appsettings.Environment. json, dan Manajer rahasia.

Pemisah : tidak berfungsi dengan kunci hierarki variabel lingkungan di semua platform. Misalnya, pemisah : tidak didukung oleh Bash. Garis bawah ganda (__), yang didukung di semua platform, secara otomatis menggantikan pemisah apa pun : dalam variabel lingkungan.

TransientFaultHandlingOptions Pertimbangkan kelas:

public class TransientFaultHandlingOptions
{
    public bool Enabled { get; set; }
    public TimeSpan AutoRetryDelay { get; set; }
}

Perintah berikut set mengatur kunci lingkungan dan nilai dan SecretKeyTransientFaultHandlingOptions.

set SecretKey="Secret key from environment"
set TransientFaultHandlingOptions__Enabled="true"
set TransientFaultHandlingOptions__AutoRetryDelay="00:00:13"

Pengaturan lingkungan ini hanya diatur dalam proses yang diluncurkan dari jendela perintah tempat pengaturannya ditetapkan. Mereka tidak dibaca oleh aplikasi web yang diluncurkan dengan Visual Studio.

Dengan Visual Studio 2019 dan yang lebih baru, Anda dapat menentukan variabel lingkungan menggunakan dialog Luncurkan Profil .

Launch Profiles dialog showing environment variables

Perintah setx berikut dapat digunakan untuk mengatur kunci dan nilai lingkungan pada Windows. Tidak seperti set, pengaturan setx tetap ada. /M mengatur variabel di lingkungan sistem. Jika switch /M tidak digunakan, variabel lingkungan pengguna diatur.

setx SecretKey "Secret key from setx environment" /M
setx TransientFaultHandlingOptions__Enabled "true" /M
setx TransientFaultHandlingOptions__AutoRetryDelay "00:00:05" /M

Untuk menguji bahwa perintah sebelumnya mengambil alih appsettings.json dan appsettings.Environment. pengaturan json:

  • Dengan Visual Studio: Keluar dan hidupkan ulang Visual Studio.
  • Dengan CLI: Mulai jendela perintah baru dan masukkan dotnet run.

Awalan

Untuk menentukan awalan untuk variabel lingkungan, panggil AddEnvironmentVariables dengan string:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Configuration.AddEnvironmentVariables(prefix: "CustomPrefix_");

using IHost host = builder.Build();

// Application code should start here.

await host.RunAsync();

Dalam kode sebelumnya:

  • config.AddEnvironmentVariables(prefix: "CustomPrefix_") ditambahkan setelah penyedia konfigurasi default. Untuk contoh pemesanan penyedia konfigurasi, lihat Penyedia konfigurasi XML.
  • Variabel lingkungan diatur dengan awalan CustomPrefix_ mengambil alih penyedia konfigurasi default. Ini termasuk variabel lingkungan tanpa awalan.

Awalan dihapus saat pasangan kunci-nilai konfigurasi dibaca.

Konfigurasi default memuat variabel lingkungan dan argumen baris perintah yang diawali dengan DOTNET_. DOTNET_ Awalan digunakan oleh .NET untuk konfigurasi host dan aplikasi, tetapi tidak untuk konfigurasi pengguna.

Untuk informasi selengkapnya tentang konfigurasi host dan aplikasi, lihat Host Generik .NET.

Awalan string koneksi

API Konfigurasi memiliki aturan pemrosesan khusus untuk empat variabel lingkungan string koneksi. String koneksi ini terlibat dalam mengonfigurasikan string koneksi Azure untuk lingkungan aplikasi. Variabel lingkungan dengan awalan yang ditampilkan dalam tabel dimuat ke dalam aplikasi dengan konfigurasi default atau ketika tidak ada awalan yang disediakan ke AddEnvironmentVariables.

Awalan string koneksi Penyedia
CUSTOMCONNSTR_ Penyedia kustom
MYSQLCONNSTR_ MySQL
SQLAZURECONNSTR_ Azure SQL Database
SQLCONNSTR_ SQL Server

Saat variabel lingkungan ditemukan dan dimuat ke dalam konfigurasi dengan salah satu dari empat awalan yang ditunjukkan dalam tabel:

  • Kunci konfigurasi dibuat dengan menghapus awalan variabel lingkungan dan menambahkan bagian kunci konfigurasi (ConnectionStrings).
  • Pasangan kunci-nilai konfigurasi baru dibuat yang mewakili penyedia koneksi database (kecuali untuk CUSTOMCONNSTR_, yang tidak memiliki penyedia).
Kunci variabel lingkungan Kunci konfigurasi yang dikonversi Entri konfigurasi penyedia
CUSTOMCONNSTR_{KEY} ConnectionStrings:{KEY} Entri konfigurasi tidak dibuat.
MYSQLCONNSTR_{KEY} ConnectionStrings:{KEY} Kunci: ConnectionStrings:{KEY}_ProviderName:
Nilai: MySql.Data.MySqlClient
SQLAZURECONNSTR_{KEY} ConnectionStrings:{KEY} Kunci: ConnectionStrings:{KEY}_ProviderName:
Nilai: System.Data.SqlClient
SQLCONNSTR_{KEY} ConnectionStrings:{KEY} Kunci: ConnectionStrings:{KEY}_ProviderName:
Nilai: System.Data.SqlClient

Variabel lingkungan diatur dalam peluncuran Pengaturan.json

Variabel lingkungan yang diatur dalam peluncuran Pengaturan.json mengambil alih yang ditetapkan di lingkungan sistem.

Pengaturan App Service Azure

Di Azure App Service, pilih Pengaturan aplikasi baru di halaman Pengaturan> Konfigurasi. Pengaturan aplikasi Azure App Service:

  • Dienkripsi saat tidak aktif dan ditransmisikan melalui saluran terenkripsi.
  • Diekspos sebagai variabel lingkungan.

Penyedia Konfigurasi baris perintah

Menggunakan konfigurasi default, CommandLineConfigurationProvider memuat konfigurasi dari pasangan kunci-nilai argumen baris perintah setelah sumber konfigurasi berikut:

  • appsettings.json dan appsettings.Environment.file json.
  • Rahasia aplikasi (Secret Manager) di Development lingkungan.
  • Variabel lingkungan.

Secara default, nilai konfigurasi yang diatur pada baris perintah mengambil alih nilai konfigurasi yang ditetapkan dengan semua penyedia konfigurasi lainnya.

Dengan Visual Studio 2019 dan yang lebih baru, Anda dapat menentukan argumen baris perintah menggunakan dialog Luncurkan Profil .

Launch Profiles dialog showing command-line arguments

Argumen baris perintah

Perintah berikut mengatur kunci dan nilai menggunakan =:

dotnet run SecretKey="Secret key from command line"

Perintah berikut mengatur kunci dan nilai menggunakan /:

dotnet run /SecretKey "Secret key set from forward slash"

Perintah berikut mengatur kunci dan nilai menggunakan --:

dotnet run --SecretKey "Secret key set from double hyphen"

Nilai kunci:

  • Harus mengikuti =, atau kunci harus memiliki awalan -- atau / jika nilai setelah spasi.
  • Tidak diperlukan jika = digunakan. Contohnya, SomeKey=.

Dalam perintah yang sama, jangan mencampur pasangan kunci-nilai argumen baris perintah yang menggunakan = dengan pasangan kunci-nilai yang menggunakan spasi.

Penyedia konfigurasi kunci per file

KeyPerFileConfigurationProvider menggunakan file direktori sebagai pasangan kunci-nilai konfigurasi. Kuncinya adalah nama file. Nilainya adalah konten file. Penyedia konfigurasi kunci per file digunakan dalam skenario hosting Docker.

Untuk mengaktifkan konfigurasi kunci per file, panggil metode ekstensi AddKeyPerFile pada instans ConfigurationBuilder. directoryPath ke file harus merupakan jalur absolut.

Izin kelebihan beban menentukan:

  • Delegasi Action<KeyPerFileConfigurationSource> yang mengonfigurasikan sumber.
  • Apakah direktori bersifat opsional dan jalur ke direktori.

Garis bawah ganda (__) digunakan sebagai pemisah kunci konfigurasi dalam nama file. Misalnya, nama file Logging__LogLevel__System menghasilkan kunci konfigurasi Logging:LogLevel:System.

Panggil ConfigureAppConfiguration saat membangun host untuk menentukan konfigurasi aplikasi:

.ConfigureAppConfiguration((_, configuration) =>
{
    var path = Path.Combine(
        Directory.GetCurrentDirectory(), "path/to/files");

    configuration.AddKeyPerFile(directoryPath: path, optional: true);
})

Penyedia konfigurasi memori

MemoryConfigurationProvider menggunakan koleksi dalam memori sebagai pasangan kunci-nilai konfigurasi.

Kode berikut menambahkan koleksi memori ke sistem konfigurasi:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Configuration.AddInMemoryCollection(
    new Dictionary<string, string?>
    {
        ["SecretKey"] = "Dictionary MyKey Value",
        ["TransientFaultHandlingOptions:Enabled"] = bool.TrueString,
        ["TransientFaultHandlingOptions:AutoRetryDelay"] = "00:00:07",
        ["Logging:LogLevel:Default"] = "Warning"
    });

using IHost host = builder.Build();

// Application code should start here.

await host.RunAsync();

Dalam kode sebelumnya, MemoryConfigurationBuilderExtensions.AddInMemoryCollection(IConfigurationBuilder, IEnumerable<KeyValuePair<String,String>>) menambahkan penyedia memori setelah penyedia konfigurasi default. Untuk contoh pemesanan penyedia konfigurasi, lihat Penyedia konfigurasi XML.

Lihat juga