[ASP.NET]web.config中參考另一個config檔

[ASP.NET]web.config中參考另一個config檔

使用ASP.NET開發系統時,最討厭的地方就在每次版更bin目錄下的dll跟修改web.config設定都需要重新啟動站台,原則上修改dll檔時要停機版更這點個人認為可以接受,因為程式更新過程如果沒有停機,是挺容易發生錯誤的,但修改設定時是否需要停機呢?我想見仁見智了,一般我們在做系統設定時常用的方法有幾種:

1.config直接設定

2.放到資料庫中

3.放到自訂的設定檔

4.其他

對一般的開發來說,放到config中的做法是很常見的,因為最簡單,不用額外寫code處理,這對部分的專案其實非常方便,但使用1.的時候就會有前面描述的問題,即使只是修改一個微不足道的設定也需要重啟服務,有沒有不修改目前程式架構就可以讓修改設定時不重新啟動服務的方法呢?如果要修改程式的話,方法多到不行,但考量到產品的維護,很多東西需要再考慮考慮,基於這樣的背景下,找到一個ASP.NET本身提供的方法,可能可以解到這個問題,這個方法是:在web.config中參考另一個config檔

在web.config檔的appSettings中加入file屬性,參考另一個config檔,這邊的案例叫做mySetting.config:


  <appSettings file="mySetting.config">
    <add key="AAA" value="BBB"/>
  </appSettings>

 

接著我們新增另一個config檔,這部分請務必記得,檔案中只能有appSettings的Tag,其它的設定還是只能訂在web.config中,


<?xml version="1.0" encoding="utf-8"?>
<appSettings>
  <add key="ABC" value="DEF"/>
</appSettings>

如果加入其它的Tag會出現下方的錯誤:

image

經過以上的設定後,我們的系統中就有兩個appSettings的設定了,其中一個是AAA,另一個是ABC,我們透過下方的寫法來讀取ABC這個位於mySetting.config的Key,


        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(ConfigurationManager.AppSettings["ABC"].ToString());
        }

而程式也正確的讀取到mySetting.config中的設定了,

image

 

接著再測試一下如果兩個config檔中都有相同的key名稱時會以哪個為準,修改一下mySetting.config檔的key從ABC-->AAA:


<?xml version="1.0" encoding="utf-8"?>
<appSettings>
  <add key="AAA" value="DEF"/>
</appSettings>

我們發現讀取到的是以mySetting.config檔的設定為主:

image

 

然後再多測試幾個case,我把mySetting.config中的key再改回ABC,然後重新整理一下,結果發現一件很有趣的事情,設定中已經沒有AAA=DEF的設定了,但讀到的結果卻還是AAA=DEF,猜測原因應該是mySetting的設定被cache了,

image

這次我改成讀取ABC的值,發現系統讀不到ABC的值,但這兩個問題在重新啟動系統後就正常了,

image

整體測試下來發現這樣的設定修改並不會立刻被套用,還是需要等到下次重新啟動後才會被套用,所以跟我本來想像的有些出入,不過這樣也有一個可能可以發揮的地方,就是當我系統有設定需要修改時,我們可以先修改,而站台不用立即被重新啟動,等待下一次的重新啟動後可直接套用新設定,這可省掉一些些服務上的時間。

 

 

看來要做到不影響站台的狀況下完成即時的設定變更,還是需要使用其它的方式來處理了,這個測試提供大家參考參考。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。