Apakah ConfigurationManager.AppSettings tersedia di .NET Core 2.0?

153

Saya punya metode yang membaca pengaturan dari file konfigurasi saya seperti ini:

var value = ConfigurationManager.AppSettings[key];

Ini dikompilasi dengan baik ketika menargetkan .NET Standard 2.0 saja.

Sekarang saya membutuhkan banyak target, jadi saya memperbarui file proyek saya dengan:

<TargetFrameworks>netcoreapp2.0;net461;netstandard2.0</TargetFrameworks>

Tapi sekarang, kompilasi gagal netcoreapp2.0dengan pesan kesalahan berikut:

Error   CS0103  The name 'ConfigurationManager' does not exist in the current context   (netcoreapp2.0)

Secara terpisah, saya membuat aplikasi konsol .NET Core 2.0 baru (kali ini hanya menargetkan .NET Core 2.0), tetapi juga tampaknya tidak ada di ConfigurationManagerbawah namespace System.Configuration.

Saya cukup bingung karena ini tersedia di bawah .NET Standard 2.0, jadi saya berharap ini akan tersedia di .NET Core 2.0, karena .NET Core 2.0 sesuai dengan .NET Standard 2.0.

Apa yang saya lewatkan?

Alex Sanséau
sumber
12
Anda mungkin melewatkan ini . (Perhatikan bahwa NET Standard sasaran meliputi baik NET dan NET Inti, sehingga benar-benar tidak perlu untuk membangun mereka secara terpisah juga.)
Jeroen Mostert
Terima kasih @JeroenMostert, menambahkan paket NuGet System.Configuration.ConfigurationManager menyelesaikan masalah. Sekarang, ini mungkin pertanyaan terpisah tetapi bagaimana .NET Core 2.0 dianggap sesuai .NET Standard 2.0 jika seseorang perlu menambahkan paket untuk mem-polyfill bit yang hilang?
Alex Sanséau
2
".NET Standard 2.0 compliant" berarti "jika Anda membangun ini untuk menargetkan .NET Standard 2.0, itu akan berjalan di .NET Core 2.0 (di antara platform lainnya)". Ini tidak berarti "jika Anda membangun ini untuk menargetkan .NET Core 2.0, semua .NET Standard 2.0 API akan tersedia tanpa tindakan lebih lanjut". Jika Anda membangun ini ke .NET Standard 2.0 dan tidak akan berjalan di .NET Core, maka Anda memiliki alasan untuk mengeluh, tetapi saya pikir ini hanya akan berhasil. (Saya belum mengujinya.)
Jeroen Mostert
4
@ AlexSanséau Paket NuGet bukan isian poli. Saat mulai mengerjakan .NET Core Microsoft mengambil keputusan untuk membuat keikutsertaan API, yang berarti bahwa aplikasi Anda memiliki footprint yang lebih kecil. Saya akan merekomendasikan meluangkan waktu dan menonton video yang telah dibuat Immo Landwerth di .NET Standard ( youtube.com/… ) - dia adalah PM di tim .NET Standard
Jamie Taylor
1
RE: It compiles fine when targeting .NET Standard 2.0 only- ini tidak benar, karena ConfigurationManagerbukan bagian dari .NET Standard (sejauh ini benar hingga v.2.1).
G. Stoynev

Jawaban:

284

Ya, ConfigurationManager.AppSettingstersedia dalam .NET Core 2.0 setelah mereferensikan paket NuGet System.Configuration.ConfigurationManager.

Penghargaan diberikan kepada @JeroenMostert karena telah memberi saya solusinya.

Alex Sanséau
sumber
1
Dapatkah Anda memposting kode dari file konfigurasi Anda? Saya mencoba mencari tahu bagaimana / di mana saya menetapkan variabel global di .NET Core 2.0
egmfrs
1
@egmfrs, maukah Anda menyusun ulang frasa? Variabel global akan ada dalam bentuk properti statis kelas. File konfigurasi berisi pengaturan aplikasi dalam format biasa:<add key="YourSetting" value="YourValue" />
Alex Sanséau
2
@ AlexSanséau, saya mencoba mencari tahu di mana saya dapat menetapkan nilai untuk AppSettings. web.config atau appsettings.json tidak berfungsi. Bisakah Anda memberikan contoh tempat menyetel AppSettings? Terima kasih.
Jan Deutschl
2
@JanDeutschl, ini harus masuk ke bagian appSettings dari web.config atau app.config Anda, seperti yang akan Anda lakukan untuk proyek .NET tradisional.
Alex Sanséau
8
Saya agak bingung Ini tidak terdaftar .NET Framework 4.6sebagai ketergantungan. Apakah itu berarti bahwa proyek` .NET Core` saya tidak lagi menjadi Coreproyek murni ?
James Poulose
21

Saya menginstal System.Configuration.ConfigurationManagerdari Nuget ke dalam aplikasi .net core 2.2 saya.

Saya kemudian referensi using System.Configuration;

Selanjutnya, saya berubah

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Sejauh ini saya yakin ini benar. 4.5.0 is typical with .net core 2.2

Saya tidak punya masalah dengan ini.

Tom Stickel
sumber
Salah satu perbaikan yang mudah dilakukan untuk migrasi. Beberapa yang lain tidak begitu menyenangkan: /
Tom Stickel
apakah Anda juga membuat file web.config?
swedish_junior_dev
3
itu tidak berhasil untuk saya (.net core 3.1). itu tidak memiliki data pengaturan jika akses
arteny
@ Arteny - Saya tidak pernah mengujinya dengan 3.1 - Saya menginstal 3.1 dan memainkannya di rumah - tetapi klien saya saat ini tidak ingin mengupgrade dalam waktu dekat.
Tom Stickel
11

Setelah Anda menyiapkan paket, Anda harus membuat app.config atau web.config dan menambahkan sesuatu seperti berikut:

<configuration>
  <appSettings>
    <add key="key" value="value"/>
  </appSettings>
</configuration>
Sharpiro
sumber
8

Rangkaian panduan terbaru adalah sebagai berikut: (dari https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Menggunakan:

System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);

Dari dokumen:

public static class EnvironmentVariablesExample
{
    [FunctionName("GetEnvironmentVariables")]
    public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
        log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
    }

    public static string GetEnvironmentVariable(string name)
    {
        return name + ": " +
            System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
    }
}

Pengaturan aplikasi dapat dibaca dari variabel lingkungan baik saat mengembangkan secara lokal maupun saat berjalan di Azure. Saat mengembangkan secara lokal, setelan aplikasi berasal dari Valueskoleksi di file local.settings.json . Di kedua lingkungan, lokal dan Azure, GetEnvironmentVariable("<app setting name>")mengambil nilai dari pengaturan aplikasi bernama. Misalnya, saat Anda menjalankan secara lokal, "Nama Situs Saya" akan ditampilkan jika file local.settings.json Anda berisi { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

The System.Configuration.ConfigurationManager.AppSettings properti adalah API alternatif untuk mendapatkan nilai-nilai pengaturan aplikasi, tetapi kami menyarankan Anda menggunakan GetEnvironmentVariableseperti yang ditunjukkan di sini.

Nate Radebaugh
sumber
Bagi siapa pun yang mencoba ini, Anda mendapatkan sintaks yang mirip dengan contoh Microsoft dengan menyatakan ini:using static System.Environment;
MattMakes
1

Anda dapat menggunakan Konfigurasi untuk mengatasi ini.

Contoh (Startup.cs):

Anda dapat meneruskan DI ke pengontrol setelah implementasi ini.

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

        Configuration = builder.Build();

    }

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

        var microserviceName = Configuration["microserviceName"];

       services.AddSingleton(Configuration);

       ...
    }
Frederico Freitas
sumber