Ishmaeel 的答案通常确实有效,但是我发现了一个问题,那就是 usingOpenMappedMachineConfiguration
似乎会丢失您从 machine.config 继承的节组。这意味着您可以访问自己的自定义部分(这是所有 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,因此通过正常渠道几乎无法访问。
我发现有两种方法可以解决这个问题。第一个,我不喜欢,是通过将它们从 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。
第二种解决方案是将您的 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 设计者的意图使用这些功能。但是,这似乎对我有用。