我最近在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>
这些都是“替换”转换,而不是一个是匹配“name”的连接字符串,另一个是匹配“key”的应用程序设置,在我看来它们是相同的。
现在查看结果包中的SetParameters.xml文件,只有连接字符串有一个setParameter节点。在PackagTmp文件夹的Web.config中,应用设置转换已应用,而连接字符串具有“$(ReplacableToken_AutoDeployDb-Web.config Connection String_0)”值,该值仅在部署包时应用。
这是为什么?它是连接字符串特有的东西(或相反,应用程序设置)?我很欣赏rationale of this approach,我不清楚为什么它适用于某些设置而不适用于其他设置。
任何人都可以对此有所了解吗?
答案 0 :(得分:37)
这实际上与配置转换无关。我刚刚在http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx发布了一篇非常详细的博客。但是这里有一些信息给你。
在Web发布管道(WPP)中,我们将连接字符串作为特殊工件处理。我们将自动为所有连接字符串创建参数。这是因为在许多情况下,当您部署应用程序时,您希望更改连接字符串。我们不会自动为任何appSettting值创建参数。现在回到你的问题为什么我们将连接字符串标记化?我们这样做是为了确保您不会错过设置值,然后意外地让您的应用程序更新错误的数据库。我们通过为您创建这些参数来帮助您。如果需要,您也可以禁用此行为。您可以将MSBuild属性 AutoParameterizationWebConfigConnectionStrings 设置为false。
答案 1 :(得分:1)
关于部署,它们之间存在一个显着差异。将Web包导入IIS时:
差异化在dev和ops之间创造了一个责任边界。一方面,您将目标环境的参数(数据库,缓存,AWS密钥/秘密等)放在操作需要处理的连接字符串中。另一方面,您在应用程序设置部分中添加了不相关的选项,因此可以减轻操作对特定产品和业务逻辑的负担。
在我的公司,一个操作员通常负责多种产品。你真的不能要求他们像你一样了解产品知识。他们需要注意的东西越少,生活就会越快乐。