La réponse d'Ishmaeel fonctionne généralement, mais j'ai trouvé un problème, qui est que l'utilisation OpenMappedMachineConfiguration
semble perdre vos groupes de sections hérités de machine.config. Cela signifie que vous pouvez accéder à vos propres sections personnalisées (ce qui est tout ce que l'OP recherché), mais pas aux sections système normales. Par exemple, ce code ne fonctionnera pas:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
En gros, si vous mettez une montre sur le configuration.SectionGroups
, vous verrez que system.net n'est pas enregistré en tant que SectionGroup, donc il est pratiquement inaccessible via les canaux normaux.
J'ai trouvé deux façons de contourner ce problème. La première, que je n'aime pas, est de réimplémenter les groupes de sections système en les copiant de machine.config dans votre propre web.config, par exemple
<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>
Je ne suis pas sûr que l'application Web elle-même fonctionnera correctement après cela, mais vous pouvez accéder correctement à la sectionGroups.
La deuxième solution consiste à ouvrir votre web.config en tant que configuration EXE, qui est probablement plus proche de sa fonction prévue de toute façon:
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!
J'ose dire qu'aucune des réponses fournies ici, ni la mienne ni celle d'Ishmaeel, n'utilise tout à fait ces fonctions comme les concepteurs .NET l'ont voulu. Mais cela semble fonctionner pour moi.