使用ConfigurationManager从任意位置加载配置

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

我想使用一个自定义的 ConfigurationSection ,并且对于ASP.NET页面来说,这很好。但是,当从传统的ASP页面通过COM interop调用该组件时,该组件不会在ASP.NET请求的上下文中运行,因此不了解web.config。

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

任何其他方法,这将是受欢迎的!

0
额外 作者 Ohad Schneider,

7 答案

尝试这个:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
0
额外
@Kiquenet:问题的关键在于strConfigPath是一个任意位置。换句话说,你决定什么是路径,而不是依赖框架来尝试从传统位置加载配置文件。我会假设服务器。 MapPath 会为您提供解决方案中任何文件的绝对位置。
额外 作者 Ishmaeel,
我如何通过编程的方式为 应用程序中托管的 WebForms应用程序 //sub.domain.com/virtualDir2/“rel =”nofollow noreferrer“> sub.domain.com/virtualDir2 和路径 C:\ Portals \ C:\ Portals \ App1 \ v2 \ web.config 中的App1 \ v2 和配置文件
额外 作者 Kiquenet,
也许 var config = System.Web.Configuration.WebConfigurationManager.OpenWebConf‌ configuration(“〜/ web.con‌ fig”);
额外 作者 Kiquenet,

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中来重新实现系统部分组。


  
    
  

我不确定此后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设计者所期望的功能。但是,这似乎适用于我。

0
额外
您也可以使用ConfigurationManager.OpenExeConfiguration(String)重载来达到同样的目的。请参阅: codeproject.com/KB/dotnet/mysteriesofconfiguration3.aspx#t2_‌ 1
额外 作者 Ohad Schneider,

使用XML处理:

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

// can call root.Elements(...)
0
额外

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

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

AppDomain.CurrentDomain.SetData("APP_CONFIG_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
}
0
额外
你使用“APP_CONFIG_FILE”吗?
额外 作者 Saturn Technologies,
这(和其他答案)不适合我。我已经在program.cs - function:Main()中添加了代码。我的配置包含程序集版本重定向(请参阅 stackoverflow.com/ questions / 30165393 / hellip; ),但重定向不会影响手动更改配置的时间。
额外 作者 Undercover1989,
这也可以加载web.config文件。我使用它来加载一个web.config而不是app.config来执行任务相关的控制台应用程序。 ;)
额外 作者 James Wilkins,

除了Ishmaeel的回答之外,方法 OpenMappedMachineConfiguration()将始终返回一个 Configuration 对象。因此,要检查它是否加载,应检查 HasFile 属性,其中true表示它来自文件。

0
额外

我按如下方式将配置值提供给word托管的.nET Compoent。

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

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

对于ASP.NET使用WebConfigurationManager:

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