2010-11-11 68 views
33

我一直在最近使用VS2010中的配置转换,但很困惑,为什么有些转换直接应用于包中的Web.config,但其他转换则存储在SetParameters.xml中的令牌中,然后应用于发布。为什么某些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连接String_0)”值。

这是为什么?它是特定于连接字符串(或相反,应用程序设置)的东西吗?我很欣赏rationale of this approach,我只是不清楚它为什么适用于某些设置而不适用于其他设置。

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

回答

37

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

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

+3

如果有一种简单的方法(通过MSBuild属性)以这种方式处理appSettings(无论是特定的还是整个集合),这将是非常有用的。例如AutoParameterizationAppSettings = true。 – 2011-05-25 23:23:05

+5

这篇文章很好的定义了解决我的问题的方法:http://vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html – 2011-05-25 23:37:38

+1

但是为什么有人想要这样? – 2012-03-26 14:00:02

1

关于部署,它们之间有一个显着的区别。当您将Web软件包导入IIS时:

节的差异造成了开发和OPS之间的责任边界“自定义参数的web.config文件中的应用程序设置”。一方面,您将目标环境(数据库,缓存,AWS密钥/秘密等)的参数放入操作系统需要处理的连接字符串中。另一方面,您在应用程序设置部分添加了不相关的选项,这样操作系统可以缓解特定产品和业务逻辑的负担。

在我的公司里,一个操作员经常负责多种产品。你真的不能要求他们像你一样知道尽可能多的产品知识。他们需要关注的东西越少,生活就会越快乐。

相关问题