Відповідь Ізмаїла, як правило, працює, проте я знайшов одне питання, а саме те, що використання, 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>
Я не впевнений, що веб-додаток після цього запуститься правильно, але ви можете правильно отримати доступ до розділуГрупи.
Друге рішення - це замість того, щоб відкрити ваш 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. Але, здається, це працює для мене.