为什么有些Web.config转换会被标记为SetParameters.xml,而有些则不会?

33

最近我一直在使用VS2010中的配置转换,但是有些困惑,不明白为什么有些转换会直接应用于包中的Web.config,而另一些则存储在SetParameters.xml中的标记中,然后在发布时进行应用。

例如,对于以下包含连接字符串和应用程序设置的Web.config:

<connectionStrings>
  <add name="AutoDeployDb" connectionString="Data Source=(local);Initial Catalog=AutoDeploy;User ID=AutoDeployUser;Password=Passw0rd"/>
</connectionStrings>
<appSettings>
  <add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
</appSettings>

那么这里是当前构建配置的相应配置转换:

<connectionStrings>
  <add xdt:Transform="Replace" xdt:Locator="Match(name)" name="AutoDeployDb" connectionString="Data Source=MyDevServer;Initial Catalog=AutoDeploy;User ID=AutoDeployUser;Password=s*#@Kdsl" />
</connectionStrings>
<appSettings>
  <add xdt:Transform="Replace" xdt:Locator="Match(key)" key="ChartImageHandler" value="storage=file;timeout=20;dir=d:\inetpub\AutoDeploy\TempImageFiles\"/>
</appSettings>

这两种转换都是"Replace"类型,除了一个连接字符串匹配"name",另一个应用程序设置匹配"key",在我看来它们是相同的。现在在生成的软件包中查看SetParameters.xml文件,只有连接字符串有一个setParameter节点。在PackagTmp文件夹的Web.config中,应用程序设置已经被应用,而连接字符串有一个"$(ReplacableToken_AutoDeployDb-Web.config Connection String_0)"值,仅在软件包部署时应用。为什么会这样?这是特定于连接字符串(或相反,特定于应用程序设置)的问题吗?我理解这种方法的基本原理,只是不清楚为什么它适用于某些设置而不适用于其他设置。能否有人解释一下这个问题?
2个回答

37

这实际上与配置转换无关。我在http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx上发布了一篇非常详细的博客,但这里有一些信息供您参考。

在Web发布管道(WPP)中,我们将连接字符串视为特殊工件进行处理。我们会自动为所有连接字符串创建参数。这是因为在许多情况下,当您部署应用程序时,您希望更改连接字符串。我们不会自动为任何appSettting值创建参数。现在回到您的问题,为什么要对连接字符串进行标记化?我们真正做的是确保您不会错过设置该值,然后意外地使您的应用程序更新错误的数据库。我们通过为您创建这些参数来帮助您。此外,如果您愿意,可以禁用此行为。您可以将MSBuild属性AutoParameterizationWebConfigConnectionStrings设置为false。


3
如果有一种简单的方式(通过 MSBuild 属性)也能这样对待 appSettings(特定的或全部的),那将非常有用。例如,AutoParameterizationAppSettings = true。 - James Webster
5
这篇文章很好地定义了解决我的问题的方法:http://vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html。 - James Webster
1
但是为什么有人想要这个呢? - Code Silverback

1

关于部署,它们之间有一个重要的区别。当您将 Web 包导入到 IIS 时:

  • 连接字符串将自动包含在向导对话框中以进行进一步的参数化。
  • 默认情况下不会有应用程序设置。如果您真的想这样做,请按照“为 Web 包部署配置参数”的“自定义参数化 - web.config 文件中的应用程序设置”部分中的步骤执行。

这种差异创建了开发和运维之间的责任边界。一方面,您将目标环境(数据库、缓存、AWS 密钥/密钥等)的参数放在连接字符串中,运维需要负责。另一方面,您将不相关的选项放在应用程序设置部分中,以便减轻运维在特定产品和业务逻辑上的负担。

在我们公司,一个运维人员通常负责多个产品。你真的不能要求他们像你一样知道产品的所有知识。他们需要注意的事情越少,生活就会越愉快。


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