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

如何在运行时替换.NET配置源,.net,configuration,.net,Configuration,这是我的问题。我有一个system.serviceModel组,其中的服务和客户端部分使用configSource工具进行外包。现在我有两套不同的外包服务/客户端文件——一套用于非安全通信,另一套用于安全通信 我希望使用命令行开关运行服务器,如/cfgSource=Secure或/cfgSource=NonSecure(或/cfgSource=kuku,前提是存在与kuku对应的服务/客户端配置文件),这将有效地将配置切换到安全或非安全模式 这就是大局。现在是细节。我的system.servic

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

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

这就是大局。现在是细节。我的
system.serviceModel
组当前看起来是这样的:

其中
绑定
行为
部分定义了安全和非安全
服务
客户端
配置所需的所有绑定和行为。现在,我希望使用命令行开关
/cfgSource=A.Plain
运行该应用程序,这将更改行

<services configSource="Cfg\A.Secure\services.config" />
<client configSource="Cfg\A.Secure\client.config" />
格瓦特!不仅configSource引用被更改(这很好),而且.Plain下的实际文件被.Secure下的文件覆盖!我理解,这是非常合乎逻辑的,但是我应该怎么做才能保持A.Plain文件的完整性,并替换configSource引用呢

提前感谢所有的好心人

附言

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

EDIT1

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

serviceModel.Sections["services"].SectionInformation.GetRawXml()

在分配给configSource之前和之后。这解释了我的文件被覆盖的原因,但仍然让我困惑如何解决我的问题。

据我所知并非如此。唯一的解决方案是从标准配置文件中删除该配置,并根据需要将其移动到非标准配置文件或数据库中。然后在启动时阅读它,并在代码中手动完成WCF配置。不要拥有它,因为我们决定追求其他更重要的挑战。我们最终将讨论配置。谷歌就是这样。你可以找到很多样品。
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();
serviceModel.Sections["services"].SectionInformation.GetRawXml()