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

голоса
111

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

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

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

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

Задан 07/08/2008 в 15:07
источник пользователем
На других языках...                            


8 ответов

голоса
108

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

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
Ответил 07/08/2008 в 15:14
источник пользователем

голоса
64

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

Я считаю, это самое лучшее решение для нетривиального-путь загрузки файла конфигурации, в частности, лучший способ прикрепить файл конфигурации 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
}
Ответил 09/01/2013 в 21:52
источник пользователем

голоса
38

Ответ Ishmaeel в обычно делает работу, но я нашел один вопрос, который , что использование , OpenMappedMachineConfigurationкажется, теряет свои наследственные группы разделов из machine.config. Это означает , что вы можете получить доступ к своим собственным разделам (которые все ОП хотели), но не нормальные участки системы. Например, этот код не будет работать:

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>

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

Второе решение это вместо того, чтобы открыть 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!

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

Ответил 29/09/2010 в 03:52
источник пользователем

голоса
9

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

Ответил 08/08/2008 в 15:04
источник пользователем

голоса
4

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

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

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
Ответил 11/11/2010 в 19:38
источник пользователем

голоса
1

Использование обработки XML:

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

// can call root.Elements(...)
Ответил 08/02/2016 в 22:18
источник пользователем

голоса
1

Для использования ASP.NET WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
Ответил 14/07/2014 в 21:43
источник пользователем

голоса
0

Это должно сделать трюк:

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

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

Ответил 09/08/2018 в 10:53
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more