再談Web 應用程式專案部署的 Web.config 轉換語法

再談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之後得到下列的結果:

image

或是可以使用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>

執行結果如下:

image

 

參考資料:

http://msdn.microsoft.com/zh-tw/library/dd465326.aspx

延伸閱讀:

http://huan-lin.blogspot.com/2010/12/aspnet-webconfig-transformation.html