1

我有一个 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 端点都会从配置文件中删除,包括我希望保留的端点。我怎样才能使它正常工作?

4

1 回答 1

0

选择节点的Locator 条件表达式似乎是正确的。如果您只有在示例中发布的两个端点,则此表达式将选择第二个端点。

根据文档,该Transform属性RemoveAll “删除选定的元素或元素”。根据您发布的信息,它没有按预期工作,因为第一个元素没有被选中并且无论如何都被删除了。根据这个 StackOverflow 的回答,在我看来问题出在Condition. 我不确定这是否是一个错误(记录不充分),但您可以尝试一些替代解决方案:

1)使用XPath代替Condition。作为表达式的结果应用于配置文件的有效 XPath 表达式Condition是:

/services/service/endpoint[contains(@address, 'MEX') and not(contains(@binding, 'mexHttpBinding'))]

您还应该使用属性而不是获得相同的结果XPathCondition

<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.

于 2014-06-19T05:21:59.307 回答