2010-11-11 41 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密鑰/祕密等)的參數放入操作系統需要處理的連接字符串中。另一方面,您在應用程序設置部分添加了不相關的選項,這樣操作系統可以緩解特定產品和業務邏輯的負擔。

在我的公司裏,一個操作員經常負責多種產品。你真的不能要求他們像你一樣知道盡可能多的產品知識。他們需要關注的東西越少,生活就會越快樂。

相關問題