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!
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);
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
}
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.
<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.
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.
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"];
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;
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(...)
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
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