Yapılandırmayı rastgele bir konumdan yüklemek için ConfigurationManager'ı kullanma


124

Klasik ASP ve ASP.NET sayfalarının bir karışımını içeren bir web sitesinde kullanılacak ve yapılandırma ayarlarını yönetmek için iyi bir yönteme ihtiyaç duyan bir veri erişim bileşeni geliştiriyorum.

Bir özel kullanmak istiyorum ConfigurationSectionve ASP.NET sayfaları için bu harika çalışıyor. Ancak bileşen, klasik bir ASP sayfasından COM birlikte çalışması aracılığıyla çağrıldığında, bileşen bir ASP.NET isteği bağlamında çalışmıyor ve bu nedenle web.config bilgisine sahip değil.

ConfigurationManagerYapılandırmayı rastgele bir yoldan yüklemesini söylemenin bir yolu var mı (örneğin ..\web.config, /binderlemem klasördeyse)? Varsa, özel ConfigurationManager.GetSectionbölümüm nulliçin varsayılan dönerse bileşenimin buna geri dönebileceğini düşünüyorum .

Bu konudaki diğer yaklaşımlar memnuniyetle karşılanacaktır!


Yanıtlar:


124

Bunu dene:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

Sub.domain.com/virtualDir2 ve C: \ Portals \ App1 \ v2 yolunda barındırılan ASP.NET WebForms uygulamam ve C: \ Portals \ App1 \ v2 \ web.config içindeki yapılandırma dosyası için programlı olarak strConfigPath değerini nasıl alabilirim ?
Kiquenet

1
@Kiquenet: Sorunun amacı strConfigPath'in keyfi bir konum olmasıdır. Başka bir deyişle, sen yolu yerine kendi geleneksel konumdan bir yapılandırma dosyası yüklemek için denemek için bir çerçeve güvenmek, ne olduğuna karar. Server.MapPath'in size çözümünüzdeki herhangi bir dosya için mutlak konumu vereceğini varsayıyorum .
Ishmaeel

1
Belkivar config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config");
Kiquenet

@Kiquenet Kesinlikle.
Ucho

66

Diğer bir çözüm, varsayılan ortam yapılandırma dosyası yolunu geçersiz kılmaktır.

Önemsiz olmayan yol yapılandırma dosyası yüklemesi için en iyi çözümü, özellikle yapılandırma dosyasını dll'ye eklemenin en iyi yolunu buluyorum.

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

Misal:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

Bu blogda daha fazla ayrıntı bulunabilir .

Ek olarak, bu diğer yanıtın , uygulama yapılandırmasını yenilemek için kod ve IDisposableorijinal durumuna geri döndürmek için bir nesne ile tamamlanan mükemmel bir çözümü vardır . Bu çözümle, geçici uygulama yapılandırmasının kapsamını koruyabilirsiniz:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}

1
Bu aynı zamanda web.config dosyalarını yüklemek için de çalışır. Görevle ilgili bir konsol uygulaması için app.config yerine bir web.config yüklemek için kullanıyorum. ;)
James Wilkins

1
Bu (ve buradaki diğer cevaplar) benim için çalışmıyor. Kodu program.cs - function: Main () içine ekledim. Yapılandırmam bir derleme sürümü yeniden yönlendirmesi içeriyor (bkz. Stackoverflow.com/questions/30165393/… ), ancak yapılandırma manuel olarak değiştirildiğinde yeniden yönlendirme etkilemiyor.
Vortex852456

1
"APP_CONFIG_FILE" kullandınız mı?
Saturn Technologies

40

Ishmaeel'in cevabı genellikle işe yarıyor, ancak bir sorun buldum, bu da kullanımın, OpenMappedMachineConfigurationmiras alınan bölüm gruplarınızı machine.config'den kaybettiği gibi görünüyor. Bu, kendi özel bölümlerinize (istenen tüm OP) erişebileceğiniz, ancak normal sistem bölümlerine erişemeyeceğiniz anlamına gelir. Örneğin, bu kod çalışmayacaktır:

ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns null

Temel olarak, bir izleme configuration.SectionGroupsyaparsanız, system.net'in bir Bölüm Grubu olarak kayıtlı olmadığını görürsünüz, bu nedenle normal kanallar aracılığıyla hemen hemen erişilemez.

Bu sorunu çözmek için bulduğum iki yol var. Birincisi, sevmediğim şey, sistem bölümü gruplarını machine.config'den kendi web.config'inize kopyalayarak yeniden uygulamaktır.

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

Web uygulamasının bundan sonra düzgün çalışacağından emin değilim, ancak bölüm gruplarına doğru bir şekilde erişebilirsiniz.

İkinci çözüm, bunun yerine web.config dosyanızı bir EXE yapılandırması olarak açmaktır; bu, muhtemelen zaten amaçlanan işlevine daha yakındır:

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!

Burada verilen cevapların hiçbirinin, ne benim ne de Ishmaeel'in, .NET tasarımcılarının amaçladığı gibi bu işlevleri tam olarak kullanmadığını söyleyebilirim. Ama bu benim için çalışıyor gibi görünüyor.


1
Aynı amaç için ConfigurationManager.OpenExeConfiguration (String) aşırı yüklemesini de kullanabilirsiniz. Bakınız: codeproject.com/KB/dotnet/mysteriesofconfiguration3.aspx#t2_1
Ohad Schneider

10

Ishmaeel'in cevabına ek olarak, yöntem OpenMappedMachineConfiguration()her zaman bir Configurationnesne döndürür . Bu nedenle, yüklenip yüklenmediğini kontrol etmek için, HasFileözelliği bir dosyadan geldiği anlamına geldiği durumda kontrol etmelisiniz .


9

Kabul edilen cevap yanlış !!

AppSettings özelliğine erişirken aşağıdaki özel durumu atar:

'System.Configuration.DefaultSection' türündeki nesne 'System.Configuration.AppSettingsSection' türüne dönüştürülemiyor.

İşte doğru çözüm:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

1
evet, bu kesinlikle doğru cevap! Cevabınızı gönderdiğiniz için teşekkürler.
Fabio Milheiro

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration'ın daha da doğru olduğunu düşünüyorum, ancak .NET Core için mevcut değil, bu durumda bu yanıt iş bitmiş gibi görünüyor.
Risord

4

Yapılandırma değerlerini barındırılan .nET Compoent sözcüğüne aşağıdaki gibi sağladım.

MS Word'de çağrılan / barındırılan bir .NET Sınıf Kitaplığı bileşeni. Bileşenime yapılandırma değerleri sağlamak için C: \ Program Files \ Microsoft Office \ OFFICE11 klasöründe winword.exe.config'i oluşturdum. Geleneksel .NET'te yaptığınız gibi yapılandırma değerlerini okuyabilmeniz gerekir.

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];

1

ASP.NET için WebConfigurationManager'ı kullanın:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;

0

XML işlemeyi kullanın:

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.