Используя диспетчер конфигураций для загрузки конфигурации с произвольным расположением


Я разрабатываю компонент доступа к данным, который будет использоваться на веб-сайте, содержащем сочетание классического ASP и ASP.NET страницы, и нужен хороший способ управления его настройками конфигурации.

Я хотел бы использовать пользовательский ConfigurationSection, и для ASP.NET страницы это отлично работает. Но когда компонент вызывается через COM-взаимодействие с классической страницы ASP, компонент не работает в контексте ASP.NET запрос и, следовательно, не имеет никакого представления о сети.конфиг.

Is есть способ сказать ConfigurationManager чтобы просто загрузить конфигурацию из произвольного пути (например,..web.config Если моя сборка в )? Если есть, то я думаю, что мой компонент может вернуться к этому, если по умолчанию ConfigurationManager.GetSection возвращает null для моего пользовательского раздела.

любые другие подходы к этому будут приветствоваться!

8 112

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. Но, кажется, это работает для меня.

В дополнение к ответу Ишмаэля, метод OpenMappedMachineConfiguration() всегда будет возвращать

Я предоставил значения конфигурации 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