使用ConfigurationManager从任意位置加载configuration
我正在开发一个数据访问组件,将在一个包含经典ASP和ASP.NET页面的网站中使用,并且需要一个pipe理其configuration设置的好方法。
我想使用一个自定义的ConfigurationSection
,并为ASP.NET页面这很好。 但是,当通过COM interop从传统的ASP页面调用组件时,该组件不在ASP.NET请求的上下文中运行,因此不了解web.config。
有没有办法告诉ConfigurationManager
从任意path加载configuration(例如..\web.config
如果我的程序集位于/bin
文件夹中, ..\web.config
)? 如果有的话,我想我的组件可以回落到,如果默认ConfigurationManager.GetSection
为我的自定义部分返回null
。
任何其他方法,这将是受欢迎的!
尝试这个:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
另一个解决scheme是覆盖默认的环境configuration文件path。
我发现它是非平凡pathconfiguration文件加载的最佳解决scheme,特别是将configuration文件附加到dll的最佳方法。
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);
例:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");
更多细节可以在这个博客上find。
此外, 这个其他的答案有一个很好的解决scheme,完整的代码来刷新应用程序configuration和一个IDisposable
对象重置它回到原来的状态。 有了这个解决scheme,你可以保持临时应用程序的configuration范围:
using(AppConfig.Change(tempFileName)) { // tempFileName is used for the app config during this context }
Ishmaeel的答案一般工作,但是我发现一个问题,那就是使用OpenMappedMachineConfiguration
似乎失去了从machine.configinheritance的部分组。 这意味着您可以访问您自己的自定义部分(这是所有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作为EXEconfiguration打开,这可能更接近其预期的function:
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的,都没有使用.NETdevise者所期望的这些function。 但是,这似乎为我工作。
除了Ishmaeel的回答之外,方法OpenMappedMachineConfiguration()
将始终返回一个Configuration
对象。 所以要检查它是否加载,你应该检查HasFile
属性,其中true表示它来自一个文件。
我按如下方式向word托pipe的.nET Compoent提供了configuration值。
在MS Word中调用/托pipe的.NET类库组件。 为了向我的组件提供configuration值,我在C:\ Program Files \ Microsoft Office \ OFFICE11文件夹中创build了winword.exe.config。 您应该能够像在传统.NET中那样读取configuration值。
string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
对于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(...)