Web.config 配合 XDT 转换进行部分替换

26

我现在的情况是只想更新WCF终结点URL的一部分。目前我们通过包含每个“变量”所有终结点的不同配置来实现这一点。这样管理起来很麻烦。我想设置一个在web.config中进行转换的方法。

以下是两个文件的示例

开发环境

  <endpoint address="http://servicesdev.host.com/RPUtilityServices/LogException.svc/restService"
        behaviorConfiguration="restfulBehavior"
        binding="webHttpBinding"
        contract="Host.RP.Shared.Common.Services.Utility.Interfaces.IExceptionUtilityService"
        name="LogService" />

以及更多这样的内容

分期

  <endpoint address="http://servicessta.host.com/RPUtilityServices/LogException.svc/restService"
            behaviorConfiguration="restfulBehavior"
            binding="webHttpBinding"
            contract="Host.RP.Shared.Common.Services.Utility.Interfaces.IExceptionUtilityService"
            name="LogService" />

区别在于servicessta和servicesdev。现在我还有servicesuat和servicesqa等等。我想设置一个转换,只替换devsta等等,而不是整个块(使用xdt:Transform="Replace")。

但我该怎么做呢?


只是好奇,通过替换URL的子字符串而不是整个属性,您能获得什么? - Mike Cheel
我还有几个类似的区块,restService,SOAP等等。这样做的好处是我只需要更新一个文件来替换服务地址,而不是所有其他文件。我们有5个环境,所以替换使得管理更容易。 - ranieuwe
2
我觉得我误解了你的帖子。我以为你想在属性上运行某种子字符串,而实际上你只想更改属性(至少这是我从你标记为正确答案的回答中得到的)。 - Mike Cheel
2
不,你说得对,我只想要子字符串替换。但这是不可能的,所以我接受了答案,因为它是下一个最好的选择。 - ranieuwe
1个回答

39

以上第一段代码(针对开发环境)可以放在Web.config中(或Web.debug.config,但必须添加xdt转换)。在你的Web.release.config中(这个将用于部署到预发布环境),定义以下元素。

<endpoint address="http://servicessta.host.com/RPUtilityServices/LogException.svc/restService"
        behaviorConfiguration="restfulBehavior"
        binding="webHttpBinding" 
        contract="Host.RP.Shared.Common.Services.Utility.Interfaces.IExceptionUtilityService"
        name="LogService" xdt:Transform="Replace" />
请注意,我在发布配置文件中添加了 xdt:Transform="Replace" 属性。有了这个属性,endpoint 元素内定义的设置将替换基本的 Web.config 文件中的设置。
有关更多信息,请参见MSDN更新: 使用 xdt:Transform="Replace" 将替换整个 <endpoint /> 元素。要选择性地替换 <endpoint /> 元素的 address 属性,请使用以下转换。
<endpoint address="http://servicessta.host.com/RPUtilityServices/LogException.svc/restService"
 xdt:Transform="SetAttributes(address)"/>

(请注意,如果存在多个<endpoint />元素,您可能还需要使用Locator属性。)

我所说的内容在我上面发布的MSDN页面中详细描述。


4
我熟悉如何在节点上执行替换(使用 xdt:Transform="Replace")。我只想替换字符串的一部分,以免到处都需要重新定义它。 - ranieuwe
1
请问你能展示一个使用多个端点和Locator属性的例子吗?不好意思,我在这里找到了答案:https://dev59.com/llPTa4cB1Zd3GeqPhTu7 - Serj Sagan
2
这完全没有回答问题。这不是子字符串替换。 - Soeren L. Nielsen
这并没有回答问题,问题是只替换字符串的一部分,而不是整个字符串。 - Holf
这并没有回答问题。 - edgar_is

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接