如何在运行时替换.NET配置源

时间:2010-12-15 08:02:11

标签: .net configuration

这是我的问题。我有一个system.serviceModel组,其中服务和客户端部分使用configSource工具进行外包。现在我有两组不同的外包服务/客户端文件 - 一组用于非安全通信,另一组用于安全通信。

我希望使用命令行开关来运行服务器,例如/ cfgSource = Secure或/ cfgSource = NonSecure(或者/ cfgSource = kuku,只要有与kuku对应的服务/客户端配置文件),这将有效地切换配置到安全或非安全模式。

这是大局。现在的细节。我的system.serviceModel组目前看起来像这样: alt text

bindingsbehaviors部分定义了安全{0}}和services配置所需的所有绑定和行为。现在我希望使用命令行开关client来运行应用程序,这将改变行

/cfgSource=A.Plain

<services configSource="Cfg\A.Secure\services.config" />
<client configSource="Cfg\A.Secure\client.config" />

所以,我很乐意继续改变配置,如下所示:

<services configSource="Cfg\A.Plain\services.config" />
<client configSource="Cfg\A.Plain\client.config" />

Gevalt!不仅configSource引用被更改(这很好),但A.Plain下的实际文件被A.Secure下的实际文件覆盖!我理解,这是非常符合逻辑的,但我应该怎么做才能保持A.Plain文件的完整性并只是替换configSource参考?

非常感谢所有优秀的撒玛利亚人。

P.S。

我对基于配置的解决方案感兴趣。我知道我可以使用XPATH更改文件,然后在新的应用程序域中运行应用程序代码。这个解决方案是我的最后一招,我希望避免它。

EDIT1

显然,像我一样在代码中更改configSource不会自动刷新引用的部分。我调用了

var cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var serviceModel = (ServiceModelSectionGroup)cfg.GetSectionGroup("system.serviceModel");
serviceModel.Sections["services"].SectionInformation.ConfigSource = @"Cfg\A.Plain\services.config";
serviceModel.Sections["client"].SectionInformation.ConfigSource = @"Cfg\A.Plain\client.config";
cfg.Save();

分配给configSource之前和之后。这解释了为什么我的文件被覆盖了,但仍然让我感到疑惑如何解决我的问题。

0 个答案:

没有答案