Сведения о вопросе

LARVION

16:03, 1st July, 2020

Теги

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

Просмотров: 476   Ответов: 9

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

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

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

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



  Сведения об ответе

lesha

18:03, 1st July, 2020

Попробовать это:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);


  Сведения об ответе

lesha

18:03, 1st July, 2020

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

Я считаю, что это лучшее решение для загрузки конфигурационного файла non-trivial-path, а именно лучший способ прикрепить конфигурационный файл к 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
}


  Сведения об ответе

lats

18:03, 1st July, 2020

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

Я не уверен, что само веб-приложение будет работать правильно после этого, но вы можете правильно получить доступ к 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!

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


  Сведения об ответе

park

18:03, 1st July, 2020

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


  Сведения об ответе

FAriza

18:03, 1st July, 2020

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

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

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];


  Сведения об ответе

pumpa

18:03, 1st July, 2020

Принятый ответ неверен!!

При обращении к свойству AppSettings возникает следующее исключение:

Невозможно привести объект типа 'System.Configuration.DefaultSection' к типу 'System.Configuration.AppSettingsSection'.

Вот правильное решение:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);


  Сведения об ответе

baggs

18:03, 1st July, 2020

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

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;


  Сведения об ответе

pumpa

18:03, 1st July, 2020

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

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

// can call root.Elements(...)


  Сведения об ответе

Chhiki

18:03, 1st July, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться