I'm mengembangkan komponen akses data yang akan digunakan dalam website yang berisi campuran classic ASP dan ASP.NET halaman, dan membutuhkan cara yang baik untuk mengelola pengaturan konfigurasi.
I'd ingin menggunakan custom ConfigurationSection
, dan untuk ASP.NET halaman ini karya besar. Tapi ketika komponen ini disebut via COM interop dari klasik halaman ASP, komponen isn't berjalan dalam konteks ASP.NET permintaan dan karena itu tidak memiliki pengetahuan tentang web.config.
Apakah ada cara untuk mengatakan ConfigurationManager
untuk hanya memuat konfigurasi dari aplikasi sewenang-wenang jalan (misalnya ..\web.config
jika saya perakitan di /bin
folder)? Jika ada maka saya'm berpikir saya komponen dapat jatuh kembali untuk itu jika default ConfigurationManager.GetSection
kembali null
untuk saya bagian kustom.
Setiap pendekatan lain untuk ini akan selamat!
Coba ini:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
Solusi lain adalah dengan mengganti default file konfigurasi path.
Saya menemukan solusi terbaik untuk non-sepele-path file konfigurasi beban, secara khusus cara terbaik untuk melampirkan file konfigurasi untuk dll.
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);
Contoh:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");
Rincian lebih lanjut dapat ditemukan di blog ini.
Selain itu, ini jawaban lain memiliki solusi yang sangat baik, lengkap dengan kode untuk me-refresh
aplikasi config dan IDisposable
objek untuk me-reset kembali ke sana's asli negara. Dengan ini
solusi, anda bisa menyimpan sementara app config scoped:
using(AppConfig.Change(tempFileName))
{
// tempFileName is used for the app config during this context
}
Ishmaeel's jawaban umumnya tidak bekerja, namun saya menemukan satu masalah, yaitu menggunakan OpenMappedMachineConfiguration
tampaknya kehilangan anda mewarisi bagian kelompok dari mesin.config. Ini berarti bahwa anda dapat mengakses kustom anda sendiri bagian (yang semua OP inginkan), tapi tidak normal bagian-bagian sistem. Misalnya, kode ini tidak akan bekerja:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Pada dasarnya, jika anda menempatkan sebuah jam konfigurasi.SectionGroups
, anda'll melihat bahwa system.net tidak terdaftar sebagai SectionGroup, sehingga's cukup banyak tidak dapat diakses melalui saluran normal.
Ada dua cara yang saya temukan untuk bekerja di sekitar ini. Pertama, yang saya don't seperti, untuk kembali menerapkan sistem bagian kelompok dengan menyalin mereka dari mesin.config ke web anda sendiri.config misalnya
<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</sectionGroup>
I'm tidak yakin aplikasi web itu sendiri akan berjalan dengan benar setelah itu, tetapi anda dapat mengakses sectionGroups dengan benar.
Kedua solusi ini bukan untuk membuka web anda.config sebagai EXE konfigurasi, yang mungkin lebih dekat dengan yang dimaksudkan fungsi pokoknya:
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns valid object!
Saya yakin tidak satupun dari jawaban yang diberikan di sini, begitu juga tambang atau Ishmaeel's, cukup menggunakan fungsi-fungsi ini bagaimana .NET desainer yang dimaksudkan. Tapi, hal ini tampaknya bekerja untuk saya.
Selain Ishmaeel's jawaban, metode OpenMappedMachineConfiguration()
akan selalu kembali Konfigurasi
objek. Jadi untuk memeriksa untuk melihat apakah itu dimuat, anda harus memeriksa HasFile
properti mana yang benar berarti itu datang dari sebuah file.
Jawaban yang diterima adalah salah!!
Melempar pengecualian berikut untuk mengakses AppSettings properti:
tidak Mampu untuk melemparkan objek dari tipe 'System.Konfigurasi.DefaultSection' untuk tipe 'System.Konfigurasi.AppSettingsSection'.
Berikut ini adalah solusi yang tepat:
System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
Saya memberikan nilai konfigurasi untuk kata host .nET Compoent sebagai berikut.
A .Perpustakaan Kelas NET komponen dipanggil/di-host di MS Word. Untuk memberikan nilai konfigurasi untuk komponen saya, saya dibuat winword.exe.config di C:\Program Files\Microsoft Office\OFFICE11 folder. Anda harus mampu membaca konfigurasi nilai-nilai seperti yang Anda lakukan secara Tradisional .NET.
string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
Untuk ASP.NET gunakan WebConfigurationManager:
var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;