再談Web 應用程式專案部署的 Web.config 轉換語法
在如何使用ASP.NET Web應用程式專案部署的Web.Config轉換語法簡化部署流程中我們提到如何插入特定組件組態(Debug、Release)所對應的組態設定檔(Web.Debug.Config、Web.Release.Config)至Web.Config,本文我們將介紹Web.Config轉換語法中兩個重要的屬性-Locator和Transform。
- Locator屬性(可省略),使用Condition、Match或XPath來選取要取代或插入的項目,其語法列舉如下:
1: Locator="Condition(XPath expression)"
2: Locator="Match(comma-delimited list of one or more attribute names)"
3: Locator="XPath(XPath expression)"
- Transform屬性,用來決定透過Locator所選取的項目要進行的動作,可以是Replace、Insert、InsertBefore、InsertAfter、Remove、RemoveAll、RemoveAttributes、SetAttributes,其語法如下:
1: Transform="Replace"
2: Transform="Insert"
3: Transform="InsertBefore(XPath expression)"
4: Transform="InsertAfter(XPath expression)"
5: Transform="Remove"
6: Transform="RemoveAll"
7: Transform="RemoveAttributes(comma-delimited list of one or more attribute names)"
8: Transform="SetAttributes(comma-delimited list of one or more attribute names)"
本文依往例舉例說明如何使用Locator及Transform屬性來進行Web.Config語法轉換。
- 假設Web.Config為下列程式碼的設定,可以看出目前資料庫連線是指到本機的執行個體。
1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!--
4: 如需如何設定 ASP.NET 應用程式的詳細資訊,請造訪
5: http://go.microsoft.com/fwlink/?LinkId=169433
6: -->
7:
8: <configuration>
9: <connectionStrings>
10: <add name="NorthwindConnectionString" connectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
11: providerName="System.Data.SqlClient" />
12: </connectionStrings>
13: <system.web>
14: <compilation debug="true" targetFramework="4.0" />
15: </system.web>
16:
17: </configuration>
若希望部署到測試環境是使用Debug的組件組態,並將資料庫連線改指到DBServer1,此時就不能使用上一篇所提的Transform=”Insert”,因為這樣會造成有兩個NorthwindConnectionString,所以我們改用下列程式碼所示的方式,先將原本的NorthwindConnectionString移除,再新增一個NorthwindConnectionString。
1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!-- 如需使用 web.config 轉換的詳細資訊,請造訪 http://go.microsoft.com/fwlink/?LinkId=125889 -->
4:
5: <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
6: <!--
7: 在下面的範例中,"SetAttributes" 轉換只會在 "Match" 定位程式找到
8: 值為 "MyDB" 的屬性 "name" 時,才將 "connectionString" 的值變
9: 更為使用 "ReleaseSQLServer"。
10:
11: <connectionStrings>
12: <add name="MyDB"
13: connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
14: xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
15: </connectionStrings>
16: -->
17: <connectionStrings>
18: <add xdt:Transform="Remove" name="NorthwindConnectionString" xdt:Locator="Match(name)"/>
19: <add name="NorthwindConnectionString" connectionString="Data Source=DBServer1;Initial Catalog=Northwind;Integrated Security=True"
20: providerName="System.Data.SqlClient" xdt:Transform="Insert" />
21: </connectionStrings>
22: <system.web>
23: <!--
24: 在下面的範例中,"Replace" 轉換將會取代 web.config 檔案
25: 的整個 <customErrors> 區段。
26: 請注意,因為在 <system.web> 節點之下
27: 只有一個 customErrors 區段,所以不需要使用 "xdt:Locator" 屬性。
28:
29: <customErrors defaultRedirect="GenericError.htm"
30: mode="RemoteOnly" xdt:Transform="Replace">
31: <error statusCode="500" redirect="InternalError.htm"/>
32: </customErrors>
33: -->
34: </system.web>
35: </configuration>
上述程式碼的第18列,使用Locator來Match名稱為NorthwindConnectionString的項目,找到之後將之移除,也就是Transform=”Remove”的部分,接著再Insert一個相同名稱但指到DBServer1的連線字串,發行Web之後得到下列的結果:
或是可以使用Transform=”Replace”方式來達到與上述範例相同的目的,下列程式碼用來將NorthwindConnectionString的資料庫連線改指到DBServer2:
1: <?xml version="1.0" encoding="utf-8"?>
2:
3: <!-- 如需使用 web.config 轉換的詳細資訊,請造訪 http://go.microsoft.com/fwlink/?LinkId=125889 -->
4:
5: <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
6: <!--
7: 在下面的範例中,"SetAttributes" 轉換只會在 "Match" 定位程式找到
8: 值為 "MyDB" 的屬性 "name" 時,才將 "connectionString" 的值變
9: 更為使用 "ReleaseSQLServer"。
10:
11: <connectionStrings>
12: <add name="MyDB"
13: connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
14: xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
15: </connectionStrings>
16: -->
17: <connectionStrings>
18: <add name="NorthwindConnectionString" connectionString="Data Source=DBServer2;Initial Catalog=Northwind;Integrated Security=True"
19: providerName="System.Data.SqlClient" xdt:Transform="Replace" />
20: </connectionStrings>
21: <system.web>
22: <compilation xdt:Transform="RemoveAttributes(debug)" />
23: <!--
24: 在下面的範例中,"Replace" 轉換將會取代 web.config 檔案
25: 的整個 <customErrors> 區段。
26: 請注意,因為在 <system.web> 節點之下
27: 只有一個 customErrors 區段,所以不需要使用 "xdt:Locator" 屬性。
28:
29: <customErrors defaultRedirect="GenericError.htm"
30: mode="RemoteOnly" xdt:Transform="Replace">
31: <error statusCode="500" redirect="InternalError.htm"/>
32: </customErrors>
33: -->
34: </system.web>
35: </configuration>
執行結果如下:
參考資料:
http://msdn.microsoft.com/zh-tw/library/dd465326.aspx
延伸閱讀:
http://huan-lin.blogspot.com/2010/12/aspnet-webconfig-transformation.html