【问题标题】:web.config transforms for <applicationSettings><applicationSettings> 的 web.config 转换
【发布时间】:2015-09-21 08:48:35
【问题描述】:

我有几个环境的 web.config 转换。在配置文件中,我有一个 applicationSettings 部分,其中包含几个设置和值对。

我已尝试根据用于匹配名称和更改连接字符串以匹配设置并更改值的语法,但转换失败。这是可能吗?

所以我的 web.config 有:

<applicationSettings>
    <AppName.My.MySettings>
        <setting name="setting1" serializeAs="String">
            <value>Initial Value</value>
        </setting>
    </AppName.My.MySettings>
</applicationSettings>

我的转换文件有

<applicationSettings>
    <add name="setting1" value="Changed Value" xdt:Transform="SetAttributes" xdt:Location="Match(name)"/>
</applicationSettings>

我在预览转换时没有收到任何错误,但连接字符串设置已转换,但 setting1 的值不是。任何帮助表示赞赏。

更新

<applicationSettings>
    <add name="setting1" value="Changed Value" xdt:Transform="Replace" xdt:Location="Match(name)"/>
</applicationSettings>

不幸的是同样的问题...没有错误也没有转换。

解决方案 我确实忘记提及我有多个设置,所以标记的答案是部分解决方案......这就是我做的...... Web.Config...

<applicationSettings>
    <AppName.My.MySettings>
        <setting name="setting1" serializeAs="String">
            <value>Initial Value 1</value>
        </setting>
        <setting name="setting2" serializeAs="String">
            <value>Initial Value 2</value>
        </setting>
        <setting name="setting3" serializeAs="String">
            <value>Initial Value 3</value>
        </setting>
    </AppName.My.MySettings>
</applicationSettings>

转换文件

<applicationSettings xdt:Transform="Replace">
    <AppName.My.MySettings>
        <setting name="setting1" serializeAs="String">
            <value>CHANGED VALUE 1</value>
        </setting>
        <setting name="setting2" serializeAs="String">
            <value>Initial value 2</value>
        </setting>
        <setting name="setting3" serializeAs="String">
            <value>CHANGED VALUE 3</value>
        </setting>
    </AppName.My.MySettings>
</applicationSettings>

请注意,我必须包含所有嵌套设置和值,即使其中一些没有像我的示例中的设置 2 那样发生变化。

【问题讨论】:

  • value 是节点不是属性,必须使用 Transform="Replace"
  • @Andreas ...请查看我的更新.. 仍然不高兴。

标签: .net web-config web.config-transform


【解决方案1】:

我知道这有点晚了,但是下面的转换文件将允许您在有多个设置时只转换一个设置。

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <applicationSettings>
    <YourProject.Settings>
      <setting name="Log4NetPath" serializeAs="String" xdt:Transform="Replace" xdt:Locator="Match(name)">
        <value xdt:Transform="Replace">NewPath</value>
      </setting>
    </YourProject.Settings>
  </applicationSettings>
</configuration>

【讨论】:

    【解决方案2】:

    转换文件:

    <applicationSettings>
       <AppName.My.MySettings>
          <setting xdt:Transform="Replace" xdt:Locator="Match(name)" name="setting1" serializeAs="String">
               <value>New Value</value>
           </setting>
        </AppName.My.MySettings>
      </applicationSettings>
    

    【讨论】:

    • 为什么这个投票没有更多?你不需要额外的 xdt:Transform on
    • 当心,这仅在您想要替换一个值时才有效。对于两个或多个值不起作用。使用 Dvirus1023 的解决方案。
    • “Dvirus1023”解决方案不起作用。不要替换该值。
    • 与@KarelKral 的经验相反,这对我来说在一个文件中使用了三种不同的设置。使用 Visual Studio 2019 和最新版本的 transform
    【解决方案3】:

    https://hk.saowen.com/a/7857cf5ec8f14af8504e7b9bb029e4cb0047336394e464a9b3807a9e1e587b93

    在单独的元素上使用变换和定位器属性

    Transform 属性不必设置在与 Locator 元素相同的元素中。您可以在父元素上指定 Locator 元素,以便选择要使用其子元素的元素。然后,您可以在子元素中指定 Transform 属性,以便将更改应用到子元素。

    以下示例显示如何使用 Locator 属性为指定路径选择位置元素。但是,只有作为所选位置元素的子元素的元素才会被转换。

    <configuration xmlns:xdt="...">
      <location path="C:\MySite\Admin" xdt:Locator="Match(path)"> 
        <system.web>
          <pages viewStateEncryptionMode="Always"
            xdt:Transform="SetAttributes(viewStateEncryptionMode)" />
        </system.web> 
      </location> 
    </configuration>
    

    如果您指定了 Locator 属性,但未在同一元素或子元素中指定 Transform 属性,则不会进行任何更改。

    【讨论】:

      【解决方案4】:

      同意以上答案。您需要确定是替换(转换)节点还是属性。

      节点是值:&lt;value&gt;Datasource=connection info&lt;/value&gt;

      属性是名称:&lt;value name="connection info"/&gt;

      要替换 节点,您可以使用:

      <value xdt:Transform="Replace">
      Datasource="connection info";
      </value>    
      

      要替换一个属性:

      <value name="other connection info"
         xdt:Transform="SetAttributes"
         xdt:Locator="Match(name)"/>
      

      更详细的替换属性参考: https://docs.microsoft.com/en-us/previous-versions/dd465326(v=vs.100)?redirectedfrom=MSDN

      【讨论】:

        【解决方案5】:

        原始文件:

        <applicationSettings>
            <AppName.My.MySettings>
                <setting name="setting1" serializeAs="String">
                    <value>Initial Value</value>
                </setting>
            </AppName.My.MySettings>
        </applicationSettings>
        

        转换文件:

         <applicationSettings>
           <AppName.My.MySettings>
              <setting name="setting1" serializeAs="String">
                   <value xdt:Transform="Replace">Changed Value</value>
               </setting>
            </AppName.My.MySettings>
          </applicationSettings>
        

        【讨论】:

        • 安德烈亚斯,它自己的变换不起作用我不得不使用 xdt:Transform="Replace" (区分大小写)。我现在有另一个问题。我有不止一个设置(准确地说是 12 个)。变换预览显示变换已完成,但全部与第一个设置相反,因此在变换结束时,设置 1 具有设置 12 的变换值,而所有其他设置 2 到设置 12 保持不变。任何想法...我想我需要一个位置。
        • 得看xml来帮你
        • Sorted.... 而不是将 xdt:Transform="Replace" 放在 value 参数中,我将它放在 applicationSettings 的根目录中,并且有效...当你指出我的时候给你信用正确的方向...用正确的解决方案更新了问题。
        • 正如 Mych 提到的,这只会替换第一个设置值。因此,如果您有 12 个设置并且只想转换第 5 个设置,它将无法正常工作。
        • @CBauer 正如我的评论中提到的,我在我的问题中放置了正确的解决方案....参见解决方案....
        猜你喜欢
        • 1970-01-01
        • 2011-02-11
        • 2011-10-14
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 2012-12-24
        • 2010-10-27
        相关资源
        最近更新 更多