Membaca pengaturan dari app.config atau web.config di .NET

807

Saya sedang mengerjakan pustaka kelas C # yang harus dapat membaca pengaturan dari file web.configatau app.config(tergantung pada apakah DLL dirujuk dari aplikasi web ASP.NET atau aplikasi Windows Forms).

Saya telah menemukan itu

ConfigurationSettings.AppSettings.Get("MySetting")

berfungsi, tetapi kode itu telah ditandai sebagai usang oleh Microsoft.

Saya telah membaca bahwa saya harus menggunakan:

ConfigurationManager.AppSettings["MySetting"]

Namun, System.Configuration.ConfigurationManagerkelas sepertinya tidak tersedia dari proyek Perpustakaan C # Class.

Apa cara terbaik untuk melakukan ini?

Russ Clark
sumber
48
Seperti saya membaca 4 contoh dan artikel MSDN .. Dan mendarat di sini. Tambahkan saja referensi .. mengapa mereka tidak bisa mengatakannya begitu saja. Pertanyaan bagus! +1
Piotr Kula
1
Jika Anda ingin menulis pengaturan kembali juga, lihat di sini bagaimana Anda bisa melakukannya.
Matt

Jawaban:

798

Anda harus menambahkan referensi ke System.Configurationdalam folder referensi proyek Anda .

Anda pasti harus menggunakan ConfigurationManagerlebih dari usang ConfigurationSettings.

womp
sumber
Terima kasih banyak! jawaban yang sangat lurus ke depan. Saya sedang membangun aplikasi konsol! dan jawaban ini selamatkan hari ini!
PatsonLeaner
1
Apakah ini masih akurat untuk .net core.
Triynko
868

Untuk contoh file app.config seperti di bawah ini:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

Anda membaca pengaturan aplikasi di atas menggunakan kode yang ditunjukkan di bawah ini:

using System.Configuration;

Anda mungkin juga perlu menambahkan referensi ke System.Configurationdalam proyek Anda jika belum ada. Anda kemudian dapat mengakses nilai-nilai seperti ini:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
Ram
sumber
124
Saya suka jawaban Anda lebih dari jawaban yang diterima. Jawaban dengan contoh selalu bermanfaat bagi saya.
Brendan Vogt
Ini berhasil untuk saya. Namun, System.Configuration saya tidak mengandung ConfigurationManager, jadi saya harus menggunakan ConfigurationSettings. Ironisnya, saya masih mendapat peringatan bahwa itu sudah usang.
Game Mimpi Buruk
13
Ini juga terjadi pada saya. Sudahkah Anda mencoba menambahkan referensi System.Configuration? Masalahnya adalah VS membodohi Anda dengan membuat Anda berpikir Anda benar-benar memilikinya; Anda dapat menggunakan intellisense untuk mendapatkan namespace System.Configuration tetapi tidak memiliki kelas ConfigurationManager. Cukup tambahkan referensi dan itu memperbaikinya.
Francine DeGrood Taylor
3
@Cricketheads System.Configuration memang mengandung ConfigurationManager, Anda mungkin kehilangan referensi ke System.Configuration dalam proyek Anda.
TreK
2
Dapatkah seseorang memberi tahu saya mengapa mereka berpikir System.Configuration tidak ditambahkan secara default ... ini sepertinya kebutuhan yang cukup mendasar di sebagian besar aplikasi.
Todd Vance
89

Pembaruan untuk .NET Framework 4.5 dan 4.6; berikut ini tidak lagi berfungsi:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Sekarang akses kelas Pengaturan melalui Properti:

string keyvalue = Properties.Settings.Default.keyname;

Lihat Mengelola Pengaturan Aplikasi untuk informasi lebih lanjut.

bsivel
sumber
1
Properti sejak 2010 .
Nick Westgate
1
Terima kasih banyak telah memposting ini. Saya menentukan bahwa Properties.Settings.Default.MachName bekerja, tetapi saya tidak tahu mengapa ConfigurationManager.AppSettings ["MachName"] mengembalikan nol.
J. Chris Compton
1
Ini mengakhiri penderitaan saya yang berkepanjangan. Terima kasih. Kerangka kerja harus memperingatkan Anda bahwa cara lama sudah usang.
Neil B
7
Tidak bisa mengkonfirmasi The ConfigurationManager.AppSettings ["someKey"] bekerja di .NET 4.5, 4.6, 4.7.1
Ivanhoe
1
@Ivanhoe Versi VisualStudio apa yang Anda gunakan? ConfigurationManager.AppSettings ["someKey"] bekerja dengan 4.6.1 dan VS 15.8.2 tetapi gagal dengan 4.6.1 dan VS 15.9.2 untuk saya.
kkuilla
37

Klik kanan pada perpustakaan kelas Anda, dan pilih opsi "Tambahkan Referensi" dari Menu.

Dan dari tab .NET, pilih System.Configuration. Ini akan termasuk file System.Configuration DLL ke proyek Anda.

Siwa
sumber
Setelah menambahkan referensi, dapat melakukanConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy
29

Saya menggunakan ini, dan itu berfungsi dengan baik untuk saya:

textBox1.Text = ConfigurationManager.AppSettings["Name"];
Pagey
sumber
48
TS secara eksplisit menyatakan, bahwa ia menggunakan kode yang sama, tetapi proyeknya gagal dikompilasi (karena referensi yang hilang, ternyata). -1 karena tidak membaca pertanyaan.
Isantipov
23

Baca Dari Konfigurasi:

Anda harus menambahkan referensi ke konfigurasi:

  1. Buka "Properties" di proyek Anda
  2. Buka Tab "Pengaturan"
  3. Tambahkan "Nama" dan "Nilai"
  4. Dapatkan Nilai dengan menggunakan kode berikut:

    string value = Properties.Settings.Default.keyname;

Simpan ke konfigurasi:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
Masoud Siahkali
sumber
1
FYI: Google paling suka jawaban Anda. Ditampilkan kata demi kata ketika Anda mencari "dapatkan pengaturan konfigurasi aplikasi c #"
Steve Gomez
21

Anda harus menambahkan referensi ke unit System.Configuration ke proyek.

Otávio Décio
sumber
18

Anda mungkin menambahkan file App.config ke file DLL. App.Config hanya berfungsi untuk proyek yang dapat dieksekusi, karena semua file DLL mengambil konfigurasi dari file konfigurasi untuk file EXE yang sedang dieksekusi.

Katakanlah Anda memiliki dua proyek dalam solusi Anda:

  • Dll
  • Seseorang

Masalah Anda mungkin terkait dengan fakta bahwa Anda menyertakan file app.config ke SomeDLL dan bukan SomeExe. SomeDll dapat membaca konfigurasi dari proyek SomeExe.

Victor Naranjo
sumber
Wow, itu tidak jelas. Jika seseorang dapat menautkan dokumen yang membicarakan hal ini, itu akan sangat fantastis. Ini adalah topik yang sulit untuk dicari.
David Krider
Terima kasih untuk ini. Tidak melihat ini dinyatakan di mana pun.
parameter
10

Coba ini:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Dalam file web.config ini harus menjadi struktur berikutnya:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
Ruslan
sumber
8

Saya memiliki masalah yang sama. Cukup baca seperti ini: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]

Tom
sumber
4
Sesuai Microsoft mengenai ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M
2
metode ini sudah usang
GabrielBB
7

web.configdigunakan dengan aplikasi web. web.configsecara default memiliki beberapa konfigurasi yang diperlukan untuk aplikasi web. Anda dapat memiliki web.configuntuk setiap folder di bawah aplikasi web Anda.

app.configdigunakan untuk aplikasi Windows. Ketika Anda membangun aplikasi di Visual Studio, itu akan secara otomatis diubah namanya menjadi <appname>.exe.configdan file ini harus dikirimkan bersama dengan aplikasi Anda.

Anda dapat menggunakan metode yang sama untuk memanggil app settingsnilai dari kedua file konfigurasi: System.Configuration.ConfigurationSettings.AppSettings ["Key"]

Wavare Santosh
sumber
Dimungkinkan juga untuk digunakan System.Configuration.COnfigurationSettings.AppSettings.Get("Key")daripada menggunakan tanda kurung siku.
Mason
7

Ketika saya menemukan pendekatan terbaik untuk mengakses variabel pengaturan aplikasi secara sistematis dengan membuat kelas wrapper melalui System.Configuration seperti di bawah ini

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;

            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

Sekarang kita dapat mengakses variabel pengaturan yang diperlukan dengan nama kode keras menggunakan kelas lain seperti di bawah ini:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting

    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }

    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }

    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }

    #endregion App setting

    #region global setting


    #endregion global setting
}
Ashwini Jindal
sumber
Ini menggunakan metode yang ditunjukkan oleh OP ditandai sebagai tidak digunakan lagi.
user2864740
4

Saya sangat menyarankan Anda untuk membuat pembungkus untuk panggilan ini. Sesuatu seperti a ConfigurationReaderServicedan menggunakan injeksi ketergantungan untuk mendapatkan kelas ini. Dengan cara ini Anda dapat mengisolasi file konfigurasi ini untuk tujuan pengujian.

Jadi gunakan yang ConfigurationManager.AppSettings["something"];disarankan dan kembalikan nilai ini. Dengan metode ini Anda dapat membuat semacam pengembalian default jika tidak ada kunci yang tersedia di file .config.

Custodio
sumber
3
Microsoft sudah memiliki bulit-in cara untuk mengelola beberapa versi dari file konfigurasi yang sama: membangun konfigurasi , yang memungkinkan memiliki file konfigurasi terpisah untuk setiap konfigurasi membangun: app.DEBUG.config, app.RELEASE.config, dan app.TEST.config, dll
jpaugh
4

Anda juga dapat menggunakan Formo :

Konfigurasi:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Kode:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();
pomber
sumber
5
Mengapa Anda ingin melakukan ini?
lukejkw
3

Hanya untuk kelengkapan, ada opsi lain yang tersedia hanya untuk proyek web: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

Manfaat dari hal ini adalah tidak memerlukan referensi tambahan untuk ditambahkan, jadi mungkin lebih disukai untuk beberapa orang.

rans
sumber
3

Langkah 1: Klik kanan pada tab referensi untuk menambahkan referensi.

Langkah 2: Klik pada tab Assemblies

Langkah 3: Cari 'System.Configuration'

Langkah 4: Klik OK.

Maka akan berhasil.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
Jitendra Suthar
sumber
2

Saya selalu membuat antarmuka IConfig dengan properti typesafe dideklarasikan untuk semua nilai konfigurasi. Kelas implementasi Config kemudian membungkus panggilan ke System.Configuration. Semua panggilan System.Configuration Anda sekarang ada di satu tempat, dan jauh lebih mudah dan lebih bersih untuk memelihara dan melacak bidang mana yang sedang digunakan dan mendeklarasikan nilai standarnya. Saya menulis satu set metode pembantu pribadi untuk membaca dan mengurai tipe data umum.

Menggunakan IOC kerangka kerja Anda dapat mengakses IConfig ladang di mana saja aplikasi dalam Anda hanya lewat antarmuka untuk konstruktor kelas. Anda juga kemudian dapat membuat implementasi tiruan dari antarmuka IConfig dalam pengujian unit Anda sehingga sekarang Anda dapat menguji berbagai nilai konfigurasi dan kombinasi nilai tanpa perlu menyentuh file App.config atau Web.config Anda.

Tony O'Hagan
sumber
1

Solusi lain yang mungkin:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
sherite
sumber
1

Saya telah mencoba menemukan perbaikan untuk masalah yang sama selama beberapa hari sekarang. Saya dapat menyelesaikan ini dengan menambahkan kunci di dalam tag pengaturan aplikasi di file web.config . Ini harus mengganti file .dll saat menggunakan helper.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>
Jason
sumber
1

Anda dapat menggunakan baris di bawah ini. Dalam kasus saya ini berfungsi: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Anda harus berhati-hati bahwa baris kode di atas juga merupakan versi lama dan sudah tidak digunakan lagi di perpustakaan baru.

Mohammad D
sumber
1

ConfigurationManager bukanlah yang Anda butuhkan untuk mengakses pengaturan Anda sendiri.

Untuk melakukan ini, Anda harus menggunakan

{YourAppName}.Properties.Settings.{settingName}

martin c
sumber
1

Saya bisa mendapatkan pendekatan di bawah ini bekerja untuk proyek .NET Core:

Langkah:

  1. Buat appsettings.json (format yang diberikan di bawah) di proyek Anda.
  2. Selanjutnya buat kelas konfigurasi. Formatnya disediakan di bawah ini.
  3. Saya telah membuat metode Login () untuk menunjukkan penggunaan Kelas Konfigurasi.

    Buat appsettings.json di proyek Anda dengan konten:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }
pengguna3534040
sumber
1

Jika Anda membutuhkan / ingin menggunakan ConfigurationManagerkelas ...

Anda mungkin perlu memuat System.Configuration.ConfigurationManageroleh Microsoft melalui Manajer Paket NuGet

Alat-> Manajer Paket NuGet-> Kelola Paket NuGet untuk Solusi ...

Microsoft Documents

Satu hal yang patut dicatat dari dokumen ...

Jika aplikasi Anda membutuhkan akses hanya baca ke konfigurasinya sendiri, kami sarankan Anda menggunakan metode GetSection (String). Metode ini menyediakan akses ke nilai konfigurasi yang di-cache untuk aplikasi saat ini, yang memiliki kinerja lebih baik daripada kelas Konfigurasi.

Chris Catignani
sumber
0

Silakan periksa versi .NET yang sedang Anda kerjakan. Itu harus lebih tinggi dari 4. Dan Anda harus menambahkan perpustakaan sistem System.Configuration ke aplikasi Anda.

nayanajith
sumber
3
Pertanyaan ini ditanyakan lebih dari 9 tahun yang lalu, dan sudah memiliki lebih dari 20 jawaban, termasuk 2 yang masing-masing memiliki lebih dari 600 upvotes, jawaban yang diterima adalah menambahkan referensi ke System.Configuration. Jawaban tambahan ini tidak menambah nilai. Paling-paling, ini harus menjadi komentar pada jawaban yang diterima.
Richardissimo
Re "lebih tinggi dari 4" : Dalam nomor versi utama? Atau maksud Anda "lebih tinggi dari 4,0" ? Atau dengan kata lain, di sisi mana .NET Framework 4.5 berada?
Peter Mortensen
-8

Ini sebuah contoh: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
JMat
sumber