Folosind ConfigurationManager pentru a încărca config dintr-o locație arbitrară

Dezvolt o componentă de acces la date care va fi utilizată într-un site web care conține o combinație de pagini clasice ASP și ASP.NET și are nevoie de o modalitate bună de a-și gestiona setările de configurare.

Aș dori să folosesc un ConfigurationSection personalizat, iar pentru paginile ASP.NET aceasta funcționează excelent. Dar când componenta este apelată prin interop COM dintr-o pagină clasică ASP, componenta nu se execută în contextul unei cereri ASP.NET și, prin urmare, nu are cunoștințe despre web.config.

Există o modalitate de a spune ConfigurationManager pentru a încărca configurația dintr-o cale arbitrară (de ex. .. \ web.config dacă asamblarea mea este în )? Dacă există atunci mă gândesc că componenta mea poate reveni la asta dacă implicit ConfigurationManager.GetSection returnează null pentru secțiunea mea personalizată.

Orice alte abordări în acest sens ar fi binevenite!

0
fr hi bn
adăugat autor Ohad Schneider, sursa

7 răspunsuri

Incearca asta:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
0
adăugat
@Kiquenet: Punctul întrebării este că strConfigPath este o locație arbitrară . Cu alte cuvinte, tu decide ce este calea, în loc să se bazeze pe cadru pentru a încerca să încarce un fișier de configurare din locația sa convențională. Mi-aș asuma Server. MapPath vă oferă locația absolută pentru toate fișierele din cadrul soluției dvs.
adăugat autor Ishmaeel, sursa
Poate var config = System.Web.Configuration.WebConfigurationManager.OpenWebConf & zwnj; iguration ("~ / web.con & zwnj; fig");
adăugat autor Kiquenet, sursa

Răspunsul lui Ishmaeel în general funcționează, totuși am găsit o problemă, și anume că folosirea OpenMappedMachineConfiguration pare să-ți piardă grupurile de secțiuni moștenite de la machine.config. Acest lucru înseamnă că puteți accesa propriile secțiuni personalizate (care este tot OP-ul dorit), dar nu și secțiunile normale ale sistemului. De exemplu, acest cod nu va funcționa:

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

Practic, dacă puneți un ceas pe configuration.SectionGroups , veți vedea că system.net nu este înregistrat ca SectionGroup, deci este aproape inaccesibil prin canalele normale.

Există două modalități prin care am descoperit că lucrez în jurul acestui lucru. Primul, care nu-mi place, este de a re-implementa grupurile de secțiuni ale sistemului prin copierea lor de la machine.config în propriul dvs. web.config, de ex.


  
    

Nu sunt sigur că aplicația web în sine va funcționa corect după aceea, dar puteți accesa secțiuneaGrupuri corect.

A doua soluție este să deschideți web.config-ul ca o configurație EXE, care este oricum mai aproape de funcția dorită:

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!

Nu îndrăznesc să spun că nici unul din răspunsurile furnizate aici, nici al meu sau al lui Ishmael, nu utilizează aceste funcții cum intenționează designerii .NET. Dar, acest lucru pare să funcționeze pentru mine.

0
adăugat
De asemenea, puteți utiliza suprasarcina ConfigurationManager.OpenExeConfiguration (String) pentru același scop. Consultați: codeproject.com/KB/dotnet/mysteriesofconfiguration3.aspx#t2_‌ 1
adăugat autor Ohad Schneider, sursa

Utilizați procesarea XML:

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

// can call root.Elements(...)
0
adăugat

O altă soluție este să înlocuiți calea implicită a fișierului de configurare a mediului implicit.

Consider că aceasta este cea mai bună soluție pentru încărcarea fișierului de configurare non-trivial, în special cea mai bună modalitate de a atașa fișierul de configurare în DLL.

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", );

Exemplu:

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

Mai multe detalii pot fi găsite la acest blog .

În plus, acest alt răspuns are o soluție excelentă, completată cu codul de reîmprospătare config-ul aplicației și un obiect IDisposable pentru ao reseta în starea inițială. Cu asta soluție, puteți să păstrați config-ul aplicației temporare cu scop:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}
0
adăugat
Ați folosit "APP_CONFIG_FILE"?
adăugat autor Saturn Technologies, sursa
Acest lucru (și celelalte răspunsuri de aici) nu funcționează pentru mine. Am adaugat codul in functia program.cs - Main: (). Config-ul meu conține o redirecționare a versiunii de asamblare (a se vedea stackoverflow.com/ întrebări / 30165393 / & hellip; ), dar redirecționarea nu afectează când config-ul este modificat manual.
adăugat autor Undercover1989, sursa
De asemenea, aceasta funcționează pentru a încărca fișierele web.config. Îl folosesc pentru a încărca un web.config în loc de app.config pentru o aplicație de consolă legate de sarcini. ;)
adăugat autor James Wilkins, sursa

Pe lângă răspunsul lui Ishmaeel, metoda OpenMappedMachineConfiguration() va întoarce întotdeauna un obiect Configuration . Deci, pentru a verifica dacă este încărcat ar trebui să verificați proprietatea HasFile unde adevărat înseamnă că a venit dintr-un fișier.

0
adăugat

Am furnizat valorile de configurare pentru cuvântul găzduit .NET Compoent după cum urmează.

O componentă de clasă .NET clasă fiind apelată / găzduită în MS Word. Pentru a furniza componentei mele de configurare, am creat winword.exe.config în folderul C: \ Program Files \ Microsoft Office \ OFFICE11. Ar trebui să puteți citi valorile configurațiilor ca dvs. în Traditional .NET.

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
0
adăugat

Pentru ASP.NET utilizați WebConfigurationManager:

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