Użycie ConfigurationManager do załadowania config z dowolnego miejsca

Rozwijam komponent dostępu do danych, który będzie używany w witrynie internetowej, która zawiera mieszankę klasycznych ASP i ASP.NET stron i potrzebują dobrego sposobu zarządzania ustawieniami konfiguracji.

Chciałbym użyć niestandardowego ConfigurationSection, a dla ASP.NET strony to działa świetnie. Ale gdy komponent jest wywoływany przez COM interop z klasycznej strony ASP, komponent nie działa w kontekście ASP.NET żądanie i dlatego nie ma wiedzy o Internecie.config.

Czy jest sposób, aby powiedzieć ConfigurationManager aby załadować konfigurację z dowolnej ścieżki (np. ..\web.config jeśli moje Zgromadzenie znajduje się w folderze /bin)? Jeśli tak, to myślę, że mój komponent może do tego wrócić, jeśli domyślna ConfigurationManager.GetSection zwróci null dla mojej sekcji niestandardowej.

Wszelkie inne podejścia do tego będą mile widziane!

Author: newfurniturey, 2008-08-07

8 answers

Spróbuj tego:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
 109
Author: Ishmaeel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-07 14:14:44

Innym rozwiązaniem jest nadpisanie domyślnej ścieżki pliku konfiguracyjnego środowiska.

Uważam, że jest to najlepsze rozwiązanie dla nietrywialnego ładowania pliku konfiguracyjnego, w szczególności najlepszy sposób dołączania pliku konfiguracyjnego do dll.

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

Przykład:

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

Więcej szczegółów można znaleźć na ten blog.

Dodatkowo, ta druga odpowiedź ma doskonałe rozwiązanie, wraz z kodem do odświeżenia konfiguracja aplikacji i obiekt IDisposable do zresetowania wraca do pierwotnego stanu. Z tym rozwiązanie, możesz zachować zakres konfiguracji aplikacji tymczasowej:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}
 64
Author: Saturn Technologies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:50

Odpowiedź Ismaeela generalnie działa, jednak znalazłem jeden problem, który polega na tym, że używanie {[3] } wydaje się tracić odziedziczone grupy sekcji z maszyny.config. Oznacza to, że możesz uzyskać dostęp do własnych sekcji niestandardowych (czyli wszystkich wymaganych opcji), ale nie do normalnych sekcji systemu. Na przykład ten kod nie będzie działał:

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

Zasadniczo, jeśli umieścisz zegarek na configuration.SectionGroups, zobaczysz, że system.net nie jest zarejestrowana jako grupa sektorowa, więc jest praktycznie niedostępna poprzez normalną kanały.

Są dwa sposoby na obejście tego. Pierwszym, co mi się nie podoba, jest ponowne zaimplementowanie grup sekcji systemowych poprzez skopiowanie ich z maszyny.config do własnej sieci.config np.
<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>

Nie jestem pewien, czy sama aplikacja internetowa będzie działać poprawnie po tym, ale możesz uzyskać dostęp do grup sektorowych poprawnie.

Drugim rozwiązaniem jest zamiast tego otwarcie sieci.config jako Konfiguracja EXE, która prawdopodobnie jest bliższa jego zamierzonej funkcji w każdym razie:

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!

Ośmielę się twierdzić, że żadna z udzielonych tutaj odpowiedzi, ani moja, ani Ismaeel, nie używają tych funkcji tak, jak zamierzali projektanci.NET. Ale wydaje mi się, że to działa.

 38
Author: Gavin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-29 02:52:01

Oprócz odpowiedzi Ismaeela, metoda OpenMappedMachineConfiguration() zawsze zwróci obiekt Configuration. Aby sprawdzić, czy jest załadowany, należy sprawdzić właściwość HasFile, gdzie true oznacza, że pochodzi z pliku.

 10
Author: Joseph Daigle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-23 09:14:57

Podałem wartości konfiguracyjne do programu word hosted. nET Compoent w następujący sposób.

Komponent biblioteki klas. NET wywoływany / hostowany w MS Word. Aby dostarczyć wartości konfiguracyjne do mojego komponentu, stworzyłem winword.exe.config in C:\Program folder Files\Microsoft Office\OFFICE11. Powinieneś być w stanie odczytać wartości konfiguracji, tak jak w tradycyjnym .NET.

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
 4
Author: Iftikhar Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 09:27:08

Dla ASP.NET użyj WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
 1
Author: Javier Cañon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 21:08:29

Użyj przetwarzania XML:

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

// can call root.Elements(...)
 1
Author: JoelFan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 22:18:57

To powinno załatwić sprawę:

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

Źródło : https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files

 0
Author: gatsby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 10:53:32