Ishmaeel の回答は一般的に機能しますが、1 つの問題が見つかりましたOpenMappedMachineConfiguration
。これは、独自のカスタム セクション (必要なすべての OP) にアクセスできることを意味しますが、通常のシステム セクションにはアクセスできません。たとえば、次のコードは機能しません。
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
基本的に、 を監視すると、configuration.SectionGroups
system.net が SectionGroup として登録されていないことがわかります。そのため、通常のチャネルからはほとんどアクセスできません。
これを回避するために私が見つけた2つの方法があります。1 つ目は、私が好まない方法ですが、システム セクション グループを machine.config から独自の web.config にコピーして再実装することです。
<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>
その後、Web アプリケーション自体が正しく動作するかどうかはわかりませんが、sectionGroups には正しくアクセスできます。
2番目の解決策は、代わりにweb.configをEXE構成として開くことです。これは、おそらく意図した機能に近いでしょう。
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!
ここで提供されている回答は、私の回答でも Ishmaeel の回答でも、.NET 設計者が意図したとおりにこれらの関数を使用しているとは言えません。しかし、これは私にはうまくいくようです。