Membaca kunci dari Web.Config menggunakan ConfigurationManager


284

Saya mencoba membaca kunci dari Web.config file di lapisan yang berbeda dari lapisan web (solusi yang sama)

Inilah yang saya coba:

string userName = System.Configuration.ConfigurationManager.AppSettings["PFUserName"];
string password = System.Configuration.ConfigurationManager.AppSettings["PFPassWord"];

Dan di sini adalah saya appSettingsdalam Web.configberkas:

<configuration>
   ....
   <appSettings>
      <add key="PFUserName" value="myusername"/>
      <add key="PFPassWord" value="mypassword"/>
   </appSettings>
   ....
</configuration>

Ketika saya men-debug kode usernamedan passwordhanya null, jadi tidak mendapatkan nilai kunci.

Apa yang saya lakukan salah untuk membaca nilai-nilai ini?


Bagaimana proyek kedua ini diakses oleh situs web Anda?
Dan Atkinson

13
Sintaks Anda benar . Anda mungkin mengedit file web.config yang salah itu sebabnya ia kembali NULL. Komentar terlambat tetapi tidak ada yang menunjukkan ini.
Hammad Khan

1
Itulah yang terjadi pada saya, saya berada di web Views.config.
JQII

1
Hanya proyek Web yang memiliki akses ke objek System.Configuration.ConfigurationManager.AppSettings. Lapisan lain tidak dapat mengakses objek ini karena mereka tidak mengimplementasikan System.Web.
Hashim Akhtar

Jawaban:


475

Coba gunakan kelas WebConfigurationManager sebagai gantinya. Sebagai contoh:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

2
Terima kasih atas jawaban Anda, saya mencoba sesuai saran Anda dan masih mendapatkan hasil yang sama. Saya sebenarnya sekarang mendapatkan NullReferenceException pada ToString ()
twal

Jika Anda mendapatkan pengecualian nol, artinya tidak menemukan pengaturan. Coba lakukan sesuatu seperti ini: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" dan Anda mungkin akan mendapatkan nilai nol yang artinya tidak menemukan pengaturan yang diminta.
Hector Correa

21
Apakah Anda yakin pengaturannya ada di web.config yang benar? (Saya telah membuat kesalahan sebelum membuang nilai-nilai saya di web.config di bawah folder "Views" dan kehilangan satu ton pemecahan masalah mengapa itu tidak berfungsi seperti yang diharapkan.
Hector Correa

Bagus. Saya senang itu terjadi.
Hector Correa

4
Terima kasih, Anda dapat melepaskan ToString karena pengindeks AppSettings sudah mengembalikan string.
Ido Ran

43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];

12
Jawaban benar. ToString()meskipun berlebihan.
anar khalilov

9
ToString bisa berbahaya jika nilainya tidak ada dalam konfigurasi aplikasi. Lebih baik untuk menjebak objek kembali dan menguji nol sebelum menyelesaikan. Coba jalankan ketika "pengaturan saya" tidak ada dalam konfigurasi dan Anda akan melihat pop pengecualian. Sebaliknya sesuatu seperti apa di bawah ini mungkin lebih aman ... string key = "mysettings"; string value = ConfigurationManager.AppSettings [key]; if (value == null) value = "nilai tidak diketahui";
Joe Healy

1
benar tidak perlu untuk .ToString () karena itu adalah string
Rola

2
@ JoHealy Anda dapat mempersingkat dan meningkatkan kejelasan dengan operator penggabungan nol:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer

Saya bertanya-tanya apa perbedaan antara jawaban ini dan kode dalam pertanyaan OP! Apakah mereka tidak sama?
user1451111

6

Jika pemanggil adalah proyek lain, Anda harus menulis config dalam proyek pemanggil bukan yang disebut.


6

Saya menemukan solusi ini sangat membantu . Ia menggunakan C # 4.0 DynamicObject untuk membungkus ConfigurationManager. Jadi alih-alih mengakses nilai seperti ini:

 WebConfigurationManager.AppSettings["PFUserName"]

Anda mengaksesnya sebagai properti:

dynamic appSettings = new AppSettingsWrapper();
Console.WriteLine(appSettings.PFUserName);  

EDIT : Menambahkan snipet kode jika tautan menjadi usang:

public class AppSettingsWrapper : DynamicObject
{
     private NameValueCollection _items;

    public AppSettingsWrapper()
    {
        _items = ConfigurationManager.AppSettings;
    }

     public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = _items[binder.Name];
        return result != null;
    }
}

2

Jalan penuh untuk itu

System.Configuration.ConfigurationManager.AppSettings["KeyName"]

2

Akan ada dua file Web.config. Saya pikir Anda mungkin bingung dengan dua file itu.

Periksa gambar ini:

klik tautan ini dan periksa gambar ini

Dalam gambar ini Anda dapat melihat dua file Web.config. Anda harus menambahkan konstanta Anda ke konstanta yang ada di folder proyek, bukan di folder views

Semoga ini bisa membantu Anda


1

Masalah ini terjadi jika proyek ini sedang digunakan oleh proyek lain. Pastikan Anda menyalin kunci pengaturan aplikasi ke app.config proyek induk atau web.config.


1

Anda juga dapat mencoba baris ini untuk mendapatkan nilai string dari app.configfile.

var strName= ConfigurationManager.AppSettings["stringName"];

0

dengan asumsi pengaturan di bawah ini dalam file .config:

<configuration>
   <appSettings>
     <add key="PFUserName" value="myusername"/>
     <add key="PFPassWord" value="mypassword"/>
   </appSettings> 
</configuration>

coba ini:

public class myController : Controller
{
    NameValueCollection myKeys = ConfigurationManager.AppSettings;

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}

-5

Maaf saya belum menguji ini tetapi saya pikir ini dilakukan seperti ini:

var filemap = new System.Configuration.ExeConfigurationFileMap();            
System.Configuration.Configuration config =  System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, System.Configuration.ConfigurationUserLevel.None);

//usage: config.AppSettings["xxx"]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.