我正在开发一个数据访问组件,该组件将在包含经典 ASP 和 ASP.NET 页面混合的网站中使用,并且需要一种好的方法来管理其配置设置。

我想使用自定义的 ConfigurationSection, ,对于 ASP.NET 页面来说,这非常有效。但是,当从经典 ASP 页面通过 COM 互操作调用该组件时,该组件并不在 ASP.NET 请求的上下文中运行,因此不了解 web.config。

有没有办法告诉 ConfigurationManager 仅从任意路径加载配置(例如 ..\web.config 如果我的程序集位于 /bin 文件夹)?如果有的话我想我的组件可以回退到默认值 ConfigurationManager.GetSection 回报 null 对于我的自定义部分。

欢迎任何其他方法!

有帮助吗?

解决方案

尝试这个:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

其他提示

另一种解决方案是覆盖默认的环境配置文件路径。

我发现它是非平凡路径配置文件加载的最佳解决方案,特别是将配置文件附加到 dll 的最佳方法。

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

例子:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

更多详细信息可参见 这个博客.

此外, 这个另一个答案 具有出色的解决方案,并配有代码来刷新应用程序配置和一个 IDisposable 对象将其重置回原始状态。使用此解决方案,您可以保留临时应用程序配置范围:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}

Ishmaeel 的答案通常有效,但是我发现了一个问题,那就是使用 OpenMappedMachineConfiguration 似乎丢失了从 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 设计者的意图使用这些函数。但是,这似乎对我有用。

除了以实玛利的答案之外,方法 OpenMappedMachineConfiguration() 总是会返回一个 Configuration 目的。因此,要检查它是否已加载,您应该检查 HasFile 属性,其中 true 表示它来自文件。

我向 word 托管的 .nET 组件提供了配置值,如下所示。

在 MS Word 中调用/托管的 .NET 类库组件。为了向我的组件提供配置值,我在 C:\Program Files\Microsoft Office\OFFICE11 文件夹中创建了 winword.exe.config。您应该能够像在传统 .NET 中那样读取配置值。

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];

接受的答案是错误的!

它在访问 AppSettings 属性时引发以下异常:

无法将“System.Configuration.DefaultSection”类型的对象强制转换为“System.Configuration.AppSettingsSection”类型。

这是正确的解决方案:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

对于 ASP.NET 使用 WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;

使用XML处理:

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)

这应该可以解决问题:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);

来源 : https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top