这是我的问题。我有一个system.serviceModel
组,其中服务和客户端部分使用configSource
工具进行外包。现在我有两组不同的外包服务/客户端文件 - 一组用于非安全通信,另一组用于安全通信。
我希望使用命令行开关来运行服务器,例如/ cfgSource = Secure或/ cfgSource = NonSecure(或者/ cfgSource = kuku,只要有与kuku对应的服务/客户端配置文件),这将有效地切换配置到安全或非安全模式。
这是大局。现在的细节。我的system.serviceModel
组目前看起来像这样:
bindings
和behaviors
部分定义了安全{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之前和之后。这解释了为什么我的文件被覆盖了,但仍然让我感到疑惑如何解决我的问题。