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