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>

这些都是“替换”转换,除了一个是与“名称”匹配的连接字符串,另一个是与“键”匹配的应用程序设置,在我看来它们是相同的。

现在查看结果包中的 SetParameters.xml 文件,只有连接字符串有一个 setParameter 节点。在 PackagTmp 文件夹的 Web.config 中,应用设置转换已应用,而连接字符串具有“$(ReplacableToken_AutoDeployDb-Web.config Connection String_0)”值,该值仅在部署包时应用。

为什么是这样?它是否特定于连接字符串(或相反,特定于应用程序设置)?我很欣赏这种方法的基本原理,我只是不清楚为什么它适用于某些设置而不是其他设置。

任何人都可以对此有所了解吗?

4

2 回答 2

37

这实际上与配置转换无关。我刚刚在http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx上发布了一个非常详细的博客。但是这里有一些信息给你。

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

于 2010-11-11T06:13:08.920 回答
1

关于部署,它们之间存在一个显着差异。将 Web 包导入 IIS 时:

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

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

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

于 2014-06-26T08:20:44.773 回答