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