Am'm în curs de dezvoltare un acces la date componentă care va fi folosit într-un site web care conține un amestec de classic ASP și ASP.NET pagini, și au nevoie de o modalitate buna de a gestiona setările de configurare.
Am'd place să folosesc un custom ConfigurationSection
, și pentru ASP.NET paginile acestei lucrări de mare. Dar când componenta este numit prin COM interop la un classic ASP page, componenta e't rulează în contextul unei ASP.NET cererea și, prin urmare, nu are cunoștințe de web.config.
Există o modalitate de a spune ConfigurationManager la doar încărcați configurația arbitrară cale (de exemplu,
..\web.configdacă ansamblul este în
/binfolder)? Dacă există apoi am'm gândirea mea componentă poate cădea înapoi la în cazul în care implicit
ConfigurationManager.GetSectiona se întoarce
null` pentru secțiunea personalizat.
Orice alte demersuri pentru acest lucru ar fi binevenit!
Încercați acest lucru:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
O altă soluție este de a trece peste implicit de configurare a mediului de calea de fișier.
Am găsit cea mai bună soluție pentru non-trivial-calea de fișier de configurare de sarcină, în special în cel mai bun mod de a atașa fișierul de configurare pentru dll.
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);
Exemplu:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");
Mai multe detalii pot fi găsite la blog.
În plus, acest alt răspuns are o soluție excelentă, completați cu codul pentru a reîmprospăta
aplicația de configurare și o IDisposable
obiect pentru a-l reseta înapoi să-l's original de stat. Cu acest
soluție, puteți să vă păstrați temporar app config luneta:
using(AppConfig.Change(tempFileName))
{
// tempFileName is used for the app config during this context
}
Ishmaeel's a răspunde, în general, nu funcționează, cu toate acestea am găsit o problemă, care este faptul că, folosind `OpenMappedMachineConfiguration pare să-și piardă moștenit secțiunea grupuri din mașină.config. Acest lucru înseamnă că puteți accesa propriile secțiuni personalizate (care este tot OP vrut), dar nu sistemul normal secțiuni. 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ă ai pus un ceas pe configurare.SectionGroups`, ai'll vedea că system.net nu este înregistrată ca un SectionGroup, deci's destul de mult inaccesibile prin canalele normale.
Există două moduri am găsit pentru a lucra în jurul valorii de acest lucru. Prima, pe care am don't ca, este de a re-pune în aplicare sistemul secțiunea grupuri prin copierea lor din mașină.config în propria ta web.config de exemplu
<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>
Am'm nu sunt sigur aplicația web în sine va rula corect după aceea, dar puteți accesa sectionGroups corect.
Cea de-a doua soluție este în loc pentru a vă deschide fișeirul web.config ca un EXE de configurare, care este, probabil, mai aproape de funcția acestuia oricum:
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!
Îndrăznesc să spun că nici unul dintre răspunsurile oferite aici, nici al meu sau Ishmaeel's, sunt destul folosind aceste funcții cum .NET designeri destinat. Dar, acest lucru pare să funcționeze pentru mine.
În plus față de Ishmaeel's a răspunde, metoda OpenMappedMachineConfiguration () va returna întotdeauna o "Configurare" obiect. Deci, pentru a verifica pentru a vedea dacă este încărcat ar trebui să verificați
HasFile de proprietate în cazul în care adevărat înseamnă a venit dintr-un fișier.
Acceptat răspunsul este greșit!!
Se aruncă următoarea excepție privind accesarea AppSettings proprietate:
nu poate să arunce obiect de tip 'System.De configurare.DefaultSection' de tip 'System.De configurare.AppSettingsSection'.
Aici este soluția corectă:
System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
Eu am furnizat valori de configurare pentru cuvântul găzduit .nET Compoent după cum urmează.
O .NET Class Library componentă a fi numit/a găzduit în MS Word. Pentru a oferi valori de configurare pentru componentele mele, am creat winword.exe.config în C:\Program Files\Microsoft Office\OFFICE11 folder. Tu ar trebui să fie capabil să citească configurații de valori ca în Tradiționale .NET.
string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
Pentru ASP.NET utilizarea WebConfigurationManager:
var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;