我有一个WCF配置文件,我试图使用SlowCheetah进行转换。对于开发用途,我们希望包含MEX端点,但是当我们发布产品时,应该删除除一个端点之外的所有服务的端点。应该留给它的服务器有以下端点:
<endpoint address="MEX"
binding="mexHttpBinding"
contract="IMetadataExchange" />
应删除的内容如下:
<endpoint address="net.tcp://computername:8001/WCFAttachmentService/MEX"
binding="netTcpBinding"
bindingConfiguration="UnsecureNetTcpBinding"
name="WCFAttachmentServiceMexEndpoint"
contract="IMetadataExchange" />
我正在使用的转换是:
<service>
<endpoint xdt:Locator="Condition(contains(@address, 'MEX') and not(contains(@binding, 'mexHttpBinding')))" xdt:Transform="RemoveAll" />
</service>
但是,当我运行此命令时,将从配置文件中删除所有MEX端点,包括我希望保留的端口。我该如何正常工作?
答案 0 :(得分:0)
选择节点的Locator
条件表达式似乎是正确的。如果您只有在示例中发布的两个端点,则此表达式将选择第二个端点。
根据documentation Transform
属性RemoveAll
应该&#34;删除所选元素。& #34;根据您发布的信息,它没有按预期工作,因为第一个元素未被选中并且无论如何都被删除了。根据{{3}},在我看来,问题出在Condition
上。我不确定这是否是一个错误(它记录不完整),但你可以尝试一些替代解决方案:
1)使用XPath
代替Condition
。由于Condition
表达式而应用于配置文件的有效XPath表达式为:
/services/service/endpoint[contains(@address, 'MEX') and not(contains(@binding, 'mexHttpBinding'))]
您还应使用XPath
属性而不是Condition
获取相同的结果:
<endpoint xdt:Locator="XPath(/services/service/endpoint[contains(@address, 'MEX')
and not(contains(@binding, 'mexHttpBinding'))])" xdt:Transform="RemoveAll" />
2)使用Match
并测试binding
等属性。这是一个更简单的测试,IMO是执行匹配的首选方式。您可以通过binding
属性
<endpoint binding="netTcpBinding" xdt:Locator="Match(binding)" xdt:Transform="RemoveAll" />
3)如果您有许多不同的绑定,并且只想删除那些不 XPath
的那些,请使用Match
代替mexHttpBinding
:
<endpoint xdt:Locator="XPath(/services/service/endpoint[not(@binding='mexHttpBinding'))" xdt:Transform="RemoveAll" />
4)最后,您可以尝试使用Condition()
或Match()
的多个单独语句分别选择要删除的<endpoint>
元素,并使用xdt:Transform="Remove"
代替RemoveAll
。