194

我正在使用下面帖子中描述的 web.config 转换,以便为不同的环境生成配置。

http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

我可以通过匹配键来进行“替换”转换,例如

<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />

我可以做“插入”,例如

<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />

但我真正发现有用的是 ReplaceOrInsert 转换,因为我不能总是依赖具有/不具有特定密钥的原始配置文件。

有没有办法做到这一点?

4

4 回答 4

135

在VS2012中配合xdt:Transform="Remove"使用。xdt:Transform="InsertIfMissing"

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
于 2013-05-21T20:46:02.870 回答
109

我找到了一个便宜的解决方法。如果您有很多需要“替换或插入”的元素,它并不漂亮并且不会很好地工作。

执行“删除”,然后执行“InsertAfter|InsertBefore”。

例如,

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
于 2011-05-12T15:58:37.110 回答
100

使用InsertIfMissing转换确保 appSetting 存在。
然后使用Replace转换来设置它的值。

<appSettings>
  <add key="Environment" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

您也可以使用SetAttributes转换而不是Replace. 不同的是SetAttributes不触及子节点。

<appSettings>  
  <add key="UseLivePaymentService" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="UseLivePaymentService" value="true" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>

这些技术比删除+插入要好得多,因为现有节点不会移动到其父节点的底部。新节点附加在末尾。现有节点保留在源文件中的位置。

此答案仅适用于较新版本的 Visual Studio(2012 或更高版本)。

于 2015-07-10T14:12:41.663 回答
7

对我来说更好的方法是仅在元素不存在时才插入元素,因为我只设置某些属性。删除元素将丢弃主元素的任何其他属性(如果它们存在)。

示例:web.config(无元素)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

web.config(带元素)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceDebug httpsHelpPageEnabled="true" />
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

将 Locator 与 XPath 表达式一起使用,如果节点不存在,则添加节点,然后设置我的属性:

<serviceDebug xdt:Transform="Insert"
  xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" />
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" />

两个生成的 web.config 文件都具有 includeExceptionDetailInFaults="true" 并且第二个保留了 httpsHelpPageEnabled 属性,而 remove/insert 方法则不会。

于 2011-07-19T05:28:07.917 回答