La respuesta de Ishmaeel generalmente funciona, sin embargo, encontré un problema, que es que el uso OpenMappedMachineConfiguration
parece perder los grupos de secciones heredados de machine.config. Esto significa que puede acceder a sus propias secciones personalizadas (que es todo lo que el OP quería), pero no a las secciones normales del sistema. Por ejemplo, este código no funcionará:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Básicamente, si pone un reloj en el configuration.SectionGroups
, verá que system.net no está registrado como SectionGroup, por lo que es prácticamente inaccesible a través de los canales normales.
Hay dos formas que encontré para evitar esto. El primero, que no me gusta, es volver a implementar los grupos de secciones del sistema copiándolos de machine.config en su propio web.config, por ejemplo
<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>
No estoy seguro de que la aplicación web se ejecute correctamente después de eso, pero puede acceder a la sección Grupos correctamente.
La segunda solución es abrir su web.config como una configuración EXE, que probablemente esté más cerca de su función prevista de todos modos:
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!
Me atrevo a decir que ninguna de las respuestas proporcionadas aquí, ni la mía ni la de Ishmaeel, están utilizando estas funciones como pretendían los diseñadores de .NET. Pero, esto parece funcionar para mí.