[ASP.NET]Config組態繼承

[ASP.NET]Config組態繼承
ASP.NET的組態檔(config)本身具備有繼承的觀念,也就是較低階層的config檔可以延續上一階層config的設定,這個特性與物件導向的繼承很類似

ASP.NET的組態檔(config)本身具備有繼承的觀念,也就是較低階層的config檔可以延續上一階層config的設定,這個特性與物件導向的繼承很類似,對於組態的繼承沒有概念的朋友可以先看看以下說明:

我們將ASP.NET的組態分成以下幾個階層,從最上層的Machine.config跟同目錄下的web.config為起始,網下還有三層的web.config設定:
 
image

這幾層Config設定的差異可以簡單看看以下這張表,階層的部分就跟上面那張圖對應一下,大概就知道是甚麼意思了。
image 

接著簡單demo一下組態繼承,我使用最簡單的WebSite層級,我在站台的根目錄與NewFolder1中各有一個web.config檔:
image

兩個config唯一的差別就在Config這個Key的值不一樣:
image

依據上頭的定義,我在Default.aspx.cs的Page_Load中去讀取web.config的資訊,獨到的應該是SubConfig才對:
image

try一下,結果沒有錯誤,這邊驗證了上述的組態繼承確實是存在的,子階層的設定會蓋掉父階層的,那如果我不希望子階層去父寫我的設定時怎麼辦?很簡單,你可以透過allowOverride、lockAttributes、lockAllAttributesExcept、lockAllElementsExcept、lockItem 和 lockElements這幾個屬性來設定。
image 

不過有些項目是預設就不能複寫的,例如
ProcessModel,這是在Machine.config中就限定好的,不能在子階中修改。

為什麼這麼基礎的功能我還要再提呢?因為前兩天在一台環境很亂的機器上遇到這個問題,因為層層繼承下來,有些設定在哪邊做的都不清楚了,導致在站台下的web.config設定後整個無效,甚至直接就掛點了(主要是兩個不同版本的元件在Assembly的設定中出錯),所以才想到還是來寫篇文章,把概念講一下。

參考資料:
ASP.NET 組態檔階層架構和繼承

游舒帆 (gipi)

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