La risposta di Ishmaeel generalmente funziona, tuttavia ho riscontrato un problema, ovvero che l'utilizzo OpenMappedMachineConfiguration
sembra perdere i gruppi di sezioni ereditate da machine.config. Ciò significa che è possibile accedere alle proprie sezioni personalizzate (che è tutto l'OP desiderato), ma non alle normali sezioni di sistema. Ad esempio, questo codice non funzionerà:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Fondamentalmente, se metti un orologio su configuration.SectionGroups
, vedrai che system.net non è registrato come SectionGroup, quindi è praticamente inaccessibile tramite i normali canali.
Ci sono due modi in cui ho scoperto di aggirare questo problema. Il primo, che non mi piace, è implementare nuovamente i gruppi di sezioni del sistema copiandoli da machine.config nel proprio web.config ad es.
<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>
Non sono sicuro che la stessa applicazione web funzionerà correttamente dopo quella, ma puoi accedere correttamente alla sezione Gruppi.
La seconda soluzione è invece quella di aprire web.config come configurazione EXE, che comunque è probabilmente più vicino alla sua funzione prevista:
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!
Non oso dire che nessuna delle risposte fornite qui, né la mia né quella di Ishmaeel, stia piuttosto usando queste funzioni come intendevano i progettisti di .NET. Ma questo sembra funzionare per me.