La respuesta de Ishmaeel generalmente funciona, sin embargo, encontré un problema, que es que el uso de 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 se desea OP), 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 se pone un reloj en la configuration.SectionGroups
, verá que system.net no está registrado como un sectionGroup, por lo que es prácticamente inaccesible vía la normalidad canales
Existen dos formas de solucionar este problema. 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, p.
<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 la propia aplicación web funcionará correctamente después de eso, pero se puede acceder a los sectionGroups correctamente.
La segunda solución es lugar para abrir su web.config como una configuración EXE, que es probablemente más cercano a 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 proveídas aquí, ni mina o Ishmaeel's usa bastante estas funciones como pensaban los diseñadores de .NET. Pero, esto parece funcionar para mí.
Ver http: // stackoverflow.com/questions/3912727/openmappedexeconfiguration-vs-openexeconfiguration/6599688#6599688 –