Die Antwort von Ishmaeel funktioniert im Allgemeinen, ich habe jedoch ein Problem festgestellt: Die Verwendung OpenMappedMachineConfiguration
scheint Ihre geerbten Abschnittsgruppen von machine.config zu verlieren. Dies bedeutet, dass Sie auf Ihre eigenen benutzerdefinierten Abschnitte zugreifen können (was alles ist, was das OP wünscht), jedoch nicht auf die normalen Systemabschnitte. Zum Beispiel funktioniert dieser Code nicht:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Wenn Sie eine Uhr auf die stellen configuration.SectionGroups
, werden Sie feststellen, dass system.net nicht als SectionGroup registriert ist und daher über die normalen Kanäle so gut wie nicht zugänglich ist.
Es gibt zwei Möglichkeiten, dies zu umgehen. Die erste, die mir nicht gefällt, besteht darin, die Systemabschnittsgruppen erneut zu implementieren, indem Sie sie aus machine.config in Ihre eigene web.config kopieren, z
<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>
Ich bin nicht sicher, ob die Webanwendung selbst danach korrekt ausgeführt wird, aber Sie können korrekt auf die sectionGroups zugreifen.
Die zweite Lösung besteht stattdessen darin, Ihre web.config als EXE-Konfiguration zu öffnen, die wahrscheinlich ohnehin näher an der beabsichtigten Funktion liegt:
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!
Ich gehe davon aus, dass keine der hier gegebenen Antworten, weder meine noch die von Ishmaeel, diese Funktionen so verwenden, wie es die .NET-Designer beabsichtigt haben. Aber das scheint für mich zu funktionieren.