Odpowiedź Ishmaeela generalnie działa, jednak znalazłem jeden problem, który polega na tym, że używanie OpenMappedMachineConfiguration
wydaje się powodować utratę dziedziczonych grup sekcji z pliku machine.config. Oznacza to, że możesz uzyskać dostęp do własnych sekcji niestandardowych (czyli wszystkich potrzebnych OP), ale nie do normalnych sekcji systemu. Na przykład ten kod nie zadziała:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Zasadniczo, jeśli umieścisz zegarek na configuration.SectionGroups
, zobaczysz, że system.net nie jest zarejestrowany jako grupa SectionGroup, więc jest prawie niedostępny za pośrednictwem normalnych kanałów.
Znalazłem dwa sposoby obejścia tego problemu. Pierwszym, co mi się nie podoba, jest ponowne zaimplementowanie systemowych grup sekcji poprzez skopiowanie ich z pliku machine.config do własnego web.config np.
<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>
Nie jestem pewien, czy po tym aplikacja internetowa będzie działać poprawnie, ale możesz uzyskać poprawny dostęp do sekcjiGrupy.
Drugim rozwiązaniem jest zamiast tego otwarcie pliku web.config jako konfiguracji EXE, która i tak prawdopodobnie jest bliższa zamierzonej funkcji:
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!
Ośmielam się twierdzić, że żadna z udzielonych tutaj odpowiedzi, ani moja, ani Ishmaeel, nie wykorzystują tych funkcji tak, jak zamierzali projektanci .NET. Ale to wydaje się działać dla mnie.