調試,發布Asp.net程序的時候,開發環境和發布環境的Web.Config往往不同,比如connectionstring等。如果常常有調試,發布的需求,就需要常常修改web.config文件,這往往是一件非常麻煩的事情。
Web.Config Transformation能夠在不同的發布環境下,產生不同的web.config文件,非常方便和實用。
在新建的Web項目中有個默認的web.config, 還可以定義格式為web.[name].config文件, 這個配置文件定義的規則, 在發布的時候, 會對web.config文件進行修改。
默認項目中, 會創建Web.Debug.config和Web.Release.config文件,分別對應於Debug和Release環境。
假如我們要常常發布到測試服務器上,測試服務器和開發時候的connectionstring是不同的,看看如何使用Web.Config Transformation來解決這個問題。
1,首先添加Test配置
菜單Build->Configuration Manager, 就能看到如下的配置窗口, 添加一個新的配置Test.
也可以從這而進入添加
2,添加Test config Transformation文件
在web.confg上,點擊右鍵,Add Config Transform, VS就會為剛剛新建的Test配置新增Transformation文件 Web.Test.config
3. 修改Web.Test.config文件
下面的Web.Test.config中能夠替換web.config中的connectionstring, 關鍵是這一段
這段代碼要釋放出來的。
<add name="MyDB" connectionString="Data Source=TestSQLServer;Initial Catalog=MyTestDB;Integrated Security=True" xdt:Transform="Replace" xdt:Locator="Match(name)"/>
xdt:Transform="Replace", 指的是用來做替換操作
xdt:Locator="Match(name), 指的是匹配規則,這里是匹配name
意思是用Web.Test.config中的這個配置節用來替換web.config中name為MyDB的配置
4. 檢查發布的結果
選擇在Test配置下publish網站,你能看到最終的web.config文件,已經實現了替換connection string.
到這里已經就完成了多環境發布配置問題了,而不需要每次發布都要修改配置。
這只是解決了發布時的問題,細心的同學應該發現我上面還提到了調試。
其實有時候為了還原bug可能要鏈接不同的環境進行測試,怎么樣可以在程序編譯的時候就進行選擇不同的配置呢?
首先找到當前項目
用記事本打開拉到最下面:
加入紅框中的這段話就可以了。
先看看原始的配置
web.config的配置為:
web.debug.config的配置為:
web.Test.config的配置為:
這時只要選擇
選擇重新生成解決方案,
選擇替換,web.config配置就會被替換為web.test.config中的配置了,如下圖web.config的配置:
connectionString的值替換為Test中的配置了。
<Target Name="BeforeBuild"> <TransformXml Source="Web.Debug.config" Transform="Web.$(Configuration).config" Destination="Web.config" /> </Target>
這句話的意思就是以Web.Debug.config里面的配置為模板,生產配置存放到web.config里面
如下圖在Debug新加一個鍵值
在選擇Test重新生成一次
發現多了一個Debug配置的Key.
其實在編譯時支持改變配置文件會有副作用的可能會對版本控制有影響,比如,你剛改了web.config,然后你用了一個debug的配置去編譯,你的web.debug.config就會自動覆蓋web.config,然后你之前的修改就沒了。比較理想的方式是需要一個第三方的web.base.config,所有的環境配置文件,例如web.debug.config,都基於web.base.config去修改,就是以web.base.config為模板,web.config成為修改后的目標文件,本身是只讀的,不允許修改,只允許生成,同時也不簽入到版本庫。
有興趣的同學可以自行去查詢 Web.Config Transformation的具體語法。