如何使用自定义配置部分保存配置文件?

3

我有一个应用程序,需要在运行时将自定义部分插入到它的app/web.config文件中。通常可以通过以下方式来实现:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var mySection = new MyCustomSection { SomeProperty="foo" };

config.Sections.Add("mySection", mySection);
section.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);

我在这里遇到的问题是,我添加到配置文件中的部分需要自己的序列化处理程序。我知道可以通过创建IConfigurationSectionHandler的实现来轻松处理读取配置,但我似乎找不到一种实际写入配置部分的方法。
查看MSDN文档,ConfigurationSection类确实有SerializeSection/DeserializeSection方法,但它们被标记为内部方法,无法被覆盖。我还发现了SectionInformation中的GetRawXml/SetRawXml方法,但它们被标记为基础设施级别的调用,不应直接由用户代码调用。
我尝试做的事情是否可能?这似乎是一个非常直接的用例。
谢谢。

把那些会改变的设置存储在数据库中,这样不是更有益吗?因为对 web config 的更改会强制 IIS 重新构建。 - P6345uk
通常情况下是可以的。我在这里尝试的是是否可以加载 app.config,进行修改,然后使用不同的名称重新保存它;实际上为该配置创建“配置文件”。例如:myapp.exe.config 以及 myapp.user1.config,myapp.user2.config 等。 - mvastarelli
但如果这样做,它们在 web.config 加载之前将不可用。这是预期的功能吗? - P6345uk
这是有意为之的。这是我正在尝试的一种实验性设计,但基本上我想做的是启动应用程序,然后根据命令行上给定的“配置文件”,加载特定的app.config并使用它来驱动应用程序。 - mvastarelli
1个回答

1

这里有一个在System.Configuration.Configuration类上节省的方法。

System.Configuration.Configuration configRoot = null;
if(HttpContext.Current!=null)
    configRoot = WebConfigurationManager.OpenWebConfiguration(_urlRoot);
else
   configRoot = ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal);

ConfigurationSectionGroup configGroup = configRoot.GetSectionGroup("mySections");
foreach (ConfigurationSection configSection in configGroup.Sections)
{
    //Do some updating that needs to be saved.
}
configRoot.Save();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接