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?

twal
sumber
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"]
Hector Correa
sumber
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"];
yogeswaran K
sumber
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.

Pedang
sumber
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;
    }
}
mateuscb
sumber
2

Jalan penuh untuk itu

System.Configuration.ConfigurationManager.AppSettings["KeyName"]
Siddhartha
sumber
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

raja gangadhar
sumber
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.

Karthikeyan Muthu
sumber
1

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

var strName= ConfigurationManager.AppSettings["stringName"];
Ram Beer Singh
sumber
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"];
    }
}
Aiyoub Amini
sumber
-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"]
Lee Smith
sumber