如何使用ASP.NET Web應用程式專案部署的Web.Config轉換語法簡化部署流程

如何使用ASP.NET Web應用程式專案部署的Web.Config轉換語法簡化部署流程

在許多開發環境中為了確保開發過程與正式上線的環境能獨立運作不互相干擾,常會建立多個Web Server或DB Server供不同開發階段使用,寫過ASP.NET程式的開發人員都知道,Web.Config是ASP.NET應用程式中用來設定整個Web應用程式專案執行時的一些共同的設定,例如資料庫連線、錯誤處理及及驗證方式等。以資料庫連線為例,開發階段可能使用DBServer1這台機器當作測試資料庫,上線階段使用DBServer2作為正式資料庫,就傳統作法而言,開發人員必須在上線前手動將連線字串由DBServer1改成DBServer2,若不小心忘記改,將額外耗費一些不必要的時間來Debug。

以Visual Studio 2010所建立ASP.NET Web應用程式,新增Web.Config轉換語法的功能,讓應用程式可以設定在不同組件組態(Debug和Relase),Web.Config可以自動對應至正確的設定,只要事先設定好將來在部署時,不需再做任何調整,進而提高部署的正確性。

預設建立ASP.NET Web應用程式會自動產生三個Web.Config,分別是Web.Config、Web.Debug.Config及Web.Release.Config(如下圖)。

image

  • 下面程式碼為Web.Config的內容,看起來相當簡潔,一些共同的設定已經移往【%systemroot\Microsoft.NET\Framework\版本編號\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:      <system.web>
  10:          <compilation debug="true" targetFramework="4.0" />
  11:      </system.web>
  12:  
  13:  </configuration>
  • 下面程式碼為Web.Debug.Config的內容,其中有一些說明可以參考。
   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:    <system.web>
  18:      <!--
  19:        在下面的範例中,"Replace" 轉換將會取代 web.config 檔案
  20:        的整個 <customErrors> 區段。
  21:        請注意,因為在 <system.web> 節點之下 
  22:        只有一個 customErrors 區段,所以不需要使用 "xdt:Locator" 屬性。
  23:        
  24:        <customErrors defaultRedirect="GenericError.htm"
  25:          mode="RemoteOnly" xdt:Transform="Replace">
  26:          <error statusCode="500" redirect="InternalError.htm"/>
  27:        </customErrors>
  28:      -->
  29:    </system.web>
  30:  </configuration>

  • 下面程式碼為Web.Release.Config的內容,其中有一些說明可以參考。
   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:    <system.web>
  18:      <compilation xdt:Transform="RemoveAttributes(debug)" />
  19:      <!--
  20:        在下面的範例中,"Replace" 轉換將會取代 web.config 檔案
  21:        的整個 <customErrors> 區段。
  22:        請注意,因為在 <system.web> 節點之下 
  23:        只有一個 customErrors 區段,所以不需要使用 "xdt:Locator" 屬性。
  24:        
  25:        <customErrors defaultRedirect="GenericError.htm"
  26:          mode="RemoteOnly" xdt:Transform="Replace">
  27:          <error statusCode="500" redirect="InternalError.htm"/>
  28:        </customErrors>
  29:      -->
  30:    </system.web>
  31:  </configuration>

接下來我們示範如何根據組件組態來對應發行專案時可以自動指定到相對應的組態設定,說明如下:

  • 下面範例示範在Web.Debug.Config增加一組name為NorthwindConnectionString的連線字串,其中Data Source為DBServer1,並指定Transform為Insert,將來以Debug組態來發行專案時將NorthwindConnectionString的設定會插入至Web.Config中connectionStrings區段的結尾處。
   1:  <connectionStrings>
   2:      <add name="NorthwindConnectionString" 
   3:          connectionString="Data Source=DBServer1;Initial Catalog=Northwind;Integrated Security=True"
   4:          providerName="System.Data.SqlClient" xdt:Transform="Insert" />
   5:  </connectionStrings>

  • 下面範例示範在Web.Release.Config增加一組name為NorthwindConnectionString的連線字串,其中Data Source為DBServer2,並指定Transform為Insert,將來以Debug組態來發行專案時將NorthwindConnectionString的設定會插入至Web.Config中connectionStrings區段的結尾處。
   1:  <connectionStrings>
   2:      <add name="NorthwindConnectionString" 
   3:          connectionString="Data Source=DBServer2;Initial Catalog=Northwind;Integrated Security=True"
   4:          providerName="System.Data.SqlClient" xdt:Transform="Insert" />
   5:  </connectionStrings>

  • 建立發行設定,預設是採用Debug組態,本例使用檔案系統的發行方法並將目標位置設定為【E:\Temp】,按下發行按鈕時會出現如下圖右的錯誤訊息,原因是因為我們是要將Web.Debug.Config中connectionStrings區段name為NorthwindConnectionString的項目插入至Web.Config,但預設Web.Config並未建立connectionStrings區段,因而造成發行專案失敗。

imageimage

  • 為解決上述問題,修改Web.Config如下,接著按下發行Web按鈕就可順利發行專案。
   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:      <system.web>
  11:          <compilation debug="true" targetFramework="4.0" />
  12:      </system.web>
  13:  
  14:  </configuration>

image

  • 以【Windows】+ 【R】開啟執行視窗後輸入【notepad e:\temp\web.config】,確實Web.Debug.Config中設定的NorthwindConnectionString項目(Data Source為DBServer1)已經順利插入至connectionStrings區段。

image

  • 接著切換至Relase組態後按下發行Web。

image

  • 以【Windows】+ 【R】開啟執行視窗後輸入【notepad e:\temp\web.config】,確實Web.Release.Config中設定的NorthwindConnectionString項目(Data Source為DBServer2)已經順利插入至connectionStrings區段。

image

備註:

Web.Config轉換語法僅適用於ASP.NET Web應用程式專案,ASP.NET網站並不支援。

參考資料:

http://msdn.microsoft.com/zh-tw/library/dd465326(VS.100).aspx