web.config 转换 - 从连接字符串部分删除注释

Posted

技术标签:

【中文标题】web.config 转换 - 从连接字符串部分删除注释【英文标题】:web.config transform - delete comments from connectionstring section 【发布时间】:2014-10-02 12:14:19 【问题描述】:

我在 web.config 中存储了几个不同的连接字符串用于开发和测试。除一个以外的所有内容均已注释掉,因此我可以根据需要更改信息。

当我发布时,我想将 connectionStrings 节点中的所有内容(包括 cmets)替换为:

<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)"/>

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

有什么想法吗?

【问题讨论】:

替换/删除/添加 cmets 并不是转换的真正预期用途。摆脱 cmets,将正确的连接字符串放入正确的转换中 - 并称之为好。 这不仅不是转换的预期用途 - 它只是不起作用。注释被显式忽略,因为它们毕竟是 cmets,因此就解析器而言不是 XML 数据的一部分。他们只会一个人呆着。 Vote 此功能将包含在 Visual Studio 中 【参考方案1】:

在 Visual Studio 2013 中,您可以拥有多个 Web.config 文件。

另外,当你创建一个新项目时,VS 会为你创建 2 个:Web.Debug.config 和 Web.Release.config。这样一来,您的调试项目和发布项目就可以使用不同的 Web.Config

【讨论】:

我尝试使用调试配置来存储我注释的连接字符串,但是当我在调试中运行它时,它不使用调试文件中的任何内容。 @davids 是正确的。对于 Web 项目,Visual Studio 使用主 web.config 并且不应用转换。但是,如果您使用 Visual Studio 部署/发布或创建项目包,则会应用转换。不过,这对 [F5] 调试没有帮助。【参考方案2】:

我根据this answer 所做的事情如下:

删除了 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:没错。它被添加但在底部。我没有进一步研究如何将它保存在正确的位置......在我的情况下,这不会有什么不同。重要的是它就在那里。 :) xdt:Transform="Replace" 在这种情况下比删除和插入更好。【参考方案3】:

不要转换字符串,或者使用“删除”和“插入”清理该部分,尝试使用“替换”。

例如:

<connectionStrings xdt:Transform="Replace">

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

</connectionStrings>

您可以完全按照自己的意愿配置此部分,即使这意味着您要添加新的 cmets。

【讨论】:

看那个!这正是我所需要的。 请注意,此解决方案解决了问题,但它通过替换配置文件的完整的连接字符串部分来解决问题。那里的任何其他连接字符串都将丢失。【参考方案4】:

如果您需要在替换的连接字符串中添加/插入/设置属性(例如,如果您使用部署),您可以嵌套转换以删除 cmets 并替换属性:

<connectionStrings xdt:Transform="Replace">
    <add name="connectionDatabase" 
         connectionString="#ConnectionString" 
         xdt:Transform="SetAttributes"
         xdt:Locator="Match(name)" />
</connectionStrings>

【讨论】:

以上是关于web.config 转换 - 从连接字符串部分删除注释的主要内容,如果未能解决你的问题,请参考以下文章

在使用web.config转换时,在web.config文件中获取此连接字符串ReplacableToken_?

从Web.Config获取多个connectionStrings到字典c#没有循环

Web.config 构建与发布转换不起作用

从 web.config 读取连接字符串

在 Azure Key Vault 中存储 SQL 数据库连接字符串

如何使用托管在本地 IIS 上的 Web 应用从 Azure 密钥保管库访问 web.config 中的应用设置和连接字符串等机密