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

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

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

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

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

113 голосов | спросил Mike Powell 7 PM00000060000002131 2008, 18:07:21

8 ответов


0

Попробуйте это:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
ответил Ishmaeel 7 PM00000060000004431 2008, 18:14:44
0

Другое решение - переопределить путь к файлу конфигурации среды по умолчанию.

Я считаю, что это лучшее решение для загрузки файла конфигурации с нетривиальным путем, особенно лучший способ присоединить файл конфигурации к 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
}
ответил Saturn Technologies 10 Jam1000000amThu, 10 Jan 2013 00:52:41 +040013 2013, 00:52:41
0

Ответ Измаила, как правило, работает, однако я обнаружил одну проблему, заключающуюся в том, что использование OpenMappedMachineConfiguration, похоже, приводит к потере унаследованных групп разделов с компьютера. .config. Это означает, что вы можете получить доступ к вашим собственным пользовательским разделам (а это все, что требуется 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, так что он почти недоступен по обычным каналам.

Есть два способа обойти это. Первое, что мне не нравится, - это повторная реализация групп системных разделов, скопировав их из machine.config в ваш собственный web.config, например.

<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>

Я не уверен, что после этого само веб-приложение будет работать правильно, но вы можете правильно обращаться к разделу Группы.

Второе решение - вместо этого открыть ваш web.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-дизайнеры. Но, похоже, это работает для меня.

ответил Gavin 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 29 Sep 2010 06:52:01 +0400 2010, 06:52:01
0

В дополнение к ответу Измаила метод OpenMappedMachineConfiguration() всегда будет возвращать Configuration объект. Поэтому, чтобы проверить, загружен ли он, следует проверить свойство HasFile, где true означает, что оно получено из файла.

ответил Joseph Daigle 8 PM00000060000003231 2008, 18:04:32
0

Я предоставил значения конфигурации для словосочетания .nET Compoent следующим образом.

Компонент библиотеки классов .NET, вызываемый /размещаемый в MS Word. Чтобы предоставить значения конфигурации для моего компонента, я создал файл winword.exe.config в папке C: \ Program Files \ Microsoft Office \ OFFICE11. Вы должны быть в состоянии прочитать значения конфигурации, как Вы делаете в Традиционном .NET.

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
ответил Iftikhar Ali 11 42010vEurope/Moscow11bEurope/MoscowThu, 11 Nov 2010 21:38:54 +0300 2010, 21:38:54
0

Для ASP.NET используйте WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
ответил Javier Cañon 15 J000000Tuesday14 2014, 00:43:22
0

Использовать обработку XML:

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

// can call root.Elements(...)
ответил JoelFan 9 FebruaryEurope/MoscowbTue, 09 Feb 2016 01:18:57 +0300000000amTue, 09 Feb 2016 01:18:57 +030016 2016, 01:18:57
0

Это должно сработать:

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

Источник: https: //www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files

ответил gatsby 9 PM00000010000003231 2018, 13:53:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132