1. 程式人生 > >ASP.NET 多環境下配置檔案web.config的靈活配置---轉

ASP.NET 多環境下配置檔案web.config的靈活配置---轉

轉自:https://www.cnblogs.com/hugogoos/p/6426887.html

除錯,釋出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成為修改後的目標檔案,本身是隻讀的,不允許修改,只允許生成,同時也不簽入到版本庫。

 常用語法

參考部落格 http://www.cnblogs.com/worksguo/archive/2009/08/29/1556307.html

1 :locator屬性

下面有個表,來詳細列舉locator的語法

(1)Match;

這裡你需要就是在你直接匹配的屬性名。     

複製程式碼
<connectionStrings>
<add name="Northwind" connectionString="connection string detail"
    providerName="System.Data.SqlClient"
    xdt:Transform="Replace"
    xdt:Locator="Match(name)" />
</connectionStrings>
複製程式碼

Engine會再你的Web.config中找到匹配name為Norhwind的就用上面的配置檔案圖替換。 
(2)Condition 
基於XPath,在Locator中應用有邏輯性的判斷表示式。

複製程式碼
 <connectionStrings>
<add name="Northwind"
    connectionString="connection string detail"
    providerName="System.Data.SqlClient"
    xdt:Transform="Replace"
    xdt:Locator="Condition(@name=’Northwind or @providerName=' System.Data.SqlClient')" />
</connectionStrings>
複製程式碼

上面就是Name屬性匹配‘Norhwind’的或providerName匹配System.Data.SqlClient的配置檔案節點都會被替換。 
(3)XPath 
這個就是直接寫XPath,http://www.w3.org/TR/xpath,這裡是XPath的標準

<location path="c:\MySite\Admin" >
<system.web xdt:Transform="Replace" xdt:Locator="XPath(//system.web)">

</system.web>
<location>

這裡你會發現,這裡可以寫一些列的表示式。

2: Transform 屬性

(1) Replace 
表示所有匹配的節點都是替換

<assemblies xdt:Transform="Replace">
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</assemblies>

其實這裡描述檔案時web.release.config,將要替換的檔案時Web.config . 
(2) Remove 
刪除第一匹配的元素。

<assemblies xdt:Transform="Remove">
</assemblies>

(3)RemoveAll

刪除所有匹配的元素

<connectionStrings>
<add xdt:Transform="RemoveAll"/>
</connectionStrings>

(4)Insert

插入從父節點中插入,(authorization中插入<deny users="*" />)

<authorization>
<deny users="*" xdt:Transform="Insert"/>
</authorization>

(5)SetAttributes

直接設定Attributes

<compilation  batch="false"
    xdt:Transform="SetAttributes(batch)">
</compilation>

(6)RemoveAttributes 
刪除出Attributes

<compilation xdt:Transform="RemoveAttributes(debug,batch)">
</compilation>

(7)InsertAfter (XPath) 
通過匹配 XPath的表示式的,找到節點,並子節點後面插入 XML

<authorization>
<deny users="AName" xdt:Transform="InsertAfter(/configuration/system.web/authorization/ allow[@roles='Admins']") />
</authorization>

(8)InsertBefore (XPath) 
通過匹配 XPath的表示式的,找到節點,並子節點前面插入 XML

<authorization>
<allow roles=" Admins" xdt:Transform="InsertBefore(/configuration/system.web/authorization/ deny[@users='*'])" />
</authorization>

(9)XSLT (filePath)

可以在外部定義 XSLT檔案,來替換Web.cofig檔案。

<appSettings xdt:Transform="XSLT(V:\MyProject\appSettings.xslt)">
</appSettings>