web.config转换 - 从connectionstring部分删除注释

23

我在Web.config中储存了几个不同的连接字符串用于开发和测试。除了一个之外,其他都已注释掉,以便需要时更改信息。

当我发布时,我希望将connectionStrings节点中的所有内容(包括注释)替换为以下内容:

<add name="myDb" connectionString="Data Source={SERVER};Initial Catalog=ManEx;User Id={USER};Password={PASSWORD};" providerName="System.Data.SqlClient"  />
<!--<add name="myDb" connectionString="Data Source={SERVER};Initial Catalog=ManEx;Integrated Security=True" providerName="System.Data.SqlClient" />-->

我知道如何用这个方法更改活动字符串:

<add name="myDb"
     connectionString="Data Source={SERVER};Initial Catalog=ManEx;User Id={USER};Password={PASSWORD};"
     providerName="System.Data.SqlClient"
     xdt:Transform="Add" 
     xdt:Locator="Match(name)"/>

但我不知道如何清除我不想要的评论并添加我想要的评论。

有任何想法吗?


2
替换/删除/添加注释并不是转换的预期用途。去掉注释,在适当的转换中放置正确的连接字符串 - 就可以了。 - Mike
1
不仅这不是变换的预期用途 - 它根本行不通。注释明确被忽略,因为它们毕竟只是注释,因此在解析器看来并不是XML数据的一部分。它们将被保持原样。 - dodexahedron
请为此功能投票,以便将其包含在Visual Studio中。投票链接 - Tim Partridge
4个回答

33

不要转换字符串,也不要使用“Remove”和“Insert”来清理区域,尝试使用“Replace”。

例如:

<connectionStrings xdt:Transform="Replace">

    <add name="myDb"
         connectionString="Data Source={SERVER};Initial Catalog=ManEx;User Id={USER};Password={PASSWORD};"
         providerName="System.Data.SqlClient" />

</connectionStrings>

您可以根据自己的需求精确地配置此部分,即使这意味着您需要添加新的评论。


1
看那个!这正是我所需要的。 - davids
1
请注意,此解决方案通过替换配置文件中的完整连接字符串部分来解决问题。任何其他连接字符串都将丢失。 - Maarten

3

我基于这个答案所做的是以下内容:

  • 删除Web.config中包含在调试期间使用的已注释连接字符串的现有connectStrings部分;
  • 重新添加connectionStrings部分,并使用正确的连接字符串在应用程序部署时使用。

因此,在您的Web.config转换文件中,您需要像这样的内容:

<!-- Removes the existing connectionStrings section which contains internal connection strings used for debugging -->
<connectionStrings xdt:Transform="Remove">    
</connectionStrings>

<!-- Re-adding the existing connectionStrings section -->
<connectionStrings xdt:Transform="Insert">

<add name="MyConnectionStringName" connectionString="Data Source=CLUSTERSQL;Initial Catalog=MyDatabase;Integrated Security=True;multipleactiveresultsets=True" providerName="System.Data.SqlClient"  xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>

</connectionStrings>

我没有考虑删除整个部分。那部分是有效的,但插入不起作用。该部分未被添加回来。 - davids
没关系,它正在被添加,只是在底部,没有人会去找它。这会引起我的用户更多的担忧。 - davids
1
@davids:没错。它被添加了,但在底部。我没有进一步研究如何将其保持在正确的位置...在我的情况下,这不会有任何影响。重要的是它在那里。 :) - Leniel Maccaferri
在这种情况下,xdt:Transform="Replace" 比 Remove 和 Insert 更好。 - kipusoep

0
如果您需要在替换的连接字符串中添加/插入/设置属性(例如,如果您使用部署),则可以嵌套转换以删除注释并替换属性:
<connectionStrings xdt:Transform="Replace">
    <add name="connectionDatabase" 
         connectionString="#{ConnectionString}" 
         xdt:Transform="SetAttributes"
         xdt:Locator="Match(name)" />
</connectionStrings>

0
在Visual Studio 2013中,您可以拥有多个Web.config文件。
此外,在创建新项目时,VS会为您创建两个文件:Web.Debug.config和Web.Release.config。这样,您就可以为调试项目和发布项目分别设置不同的Web.Config文件。

1
我尝试使用Debug配置来存储我的已注释连接字符串,但是当我在调试模式下运行时,它不会使用Debug文件中的任何内容。 - davids
1
@davids 没错。对于 Web 项目,Visual Studio 使用主 web.config,不应用转换。然而,如果您使用 Visual Studio 部署/发布或创建项目的包,则会应用转换。但是,这对于 [F5] 调试没有帮助。 - Zarepheth

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