Используя диспетчер конфигураций для загрузки конфигурации с произвольным расположением
Я разрабатываю компонент доступа к данным, который будет использоваться на веб-сайте, содержащем сочетание классического ASP и ASP.NET страницы, и нужен хороший способ управления его настройками конфигурации.
Я хотел бы использовать пользовательский ConfigurationSection, и для ASP.NET страницы это отлично работает. Но когда компонент вызывается через COM-взаимодействие с классической страницы ASP, компонент не работает в контексте ASP.NET запрос и, следовательно, не имеет никакого представления о сети.конфиг.
Is есть способ сказать ConfigurationManager чтобы просто загрузить конфигурацию из произвольного пути (например,..web.config Если моя сборка в )? Если есть, то я думаю, что мой компонент может вернуться к этому, если по умолчанию ConfigurationManager.GetSection возвращает null для моего пользовательского раздела.
любые другие подходы к этому будут приветствоваться!
8 ответов:
попробуйте это:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
другое решение-переопределить настройки по умолчанию путь к файлу.
Я считаю, что это лучшее решение для загрузки файла конфигурации нетривиального пути, в частности, лучший способ прикрепить файл конфигурации к dll.
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);пример:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");более подробную информацию можно найти в этот блог.
кроме того, это другой ответ есть отличное решение, в комплекте с кодом для обновления конфигурация приложения и
IDisposableобъект, чтобы сбросить его обратно в его исходное состояние. С этим решение, вы можете сохранить временную конфигурацию приложения в области действия:using(AppConfig.Change(tempFileName)) { // tempFileName is used for the app config during this context }
ответ Ишмаэля обычно работает, однако я нашел одну проблему, которая заключается в использовании
OpenMappedMachineConfigurationкажется, что вы теряете унаследованные группы разделов от машины.конфиг. Это означает, что вы можете получить доступ к своим собственным пользовательским разделам (это все, что требуется OP), но не к обычным системным разделам. Например, этот код не будет работать:ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap); MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns nullв принципе, если вы положите часы на
configuration.SectionGroups, вы увидите, что system.net не зарегистрирован как SectionGroup, так что это довольно много недоступно по обычным каналам.есть два способа, которые я нашел, чтобы обойти это. Первое, что мне не нравится,-это повторно реализовать группы разделов системы, скопировав их с машины.настройка в свой собственный веб.конфигурации, например,
<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>Я не уверен, что само веб-приложение будет работать правильно после этого, но вы можете получить доступ к sectionGroups правильно.
второе решение это вместо того, чтобы открыть свой веб.config как конфигурация EXE, которая вероятно, ближе к его предполагаемой функции в любом случае:
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!я осмелюсь сказать, что ни один из ответов, представленных здесь, ни мой, ни Измаила, не используют эти функции так, как предполагали разработчики .NET. Но, кажется, это работает для меня.
Я предоставил значения конфигурации word hosted.nET Compoent следующим образом.
компонент библиотеки классов .NET вызывается / размещается в MS Word. Чтобы предоставить значения конфигурации для моего компонента, я создал winword.исполняемый.config in C:\Program папка Files\Microsoft Office\OFFICE11. Вы должны быть в состоянии читать значения конфигураций, как Вы делаете в традиционном. NET.
string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
для ASP.NET используйте WebConfigurationManager:
var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/"); (..) config.AppSettings.Settings["xxxx"].Value;
использовать обработку XML:
var appPath = AppDomain.CurrentDomain.BaseDirectory; var configPath = Path.Combine(appPath, baseFileName);; var root = XElement.Load(configPath); // can call root.Elements(...)
Это должно сделать трюк:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);Источник : https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files