[ASP.NET]組態繼承

[ASP.NET]組態繼承

忘記多久之前處理過這樣的問題,客戶反應說,他使用我們公司提供的組態設定工具去設定web.config的內容後,得到的結果跟文件上講的不一樣,乍聽之下很像是個Bug,不過該設定從寫好之後應該都沒有動過,加上只有這家客戶有這樣的問題,所以我們也花了一些時間去找原因,先看一下目錄結構,大致上長這個樣子:

image

客戶反應的問題是,web.config中設定某個Key為Global時,抓到的卻不是這個值,有時會對,有時會錯,其實這種描述是我們在追bug時最討厭遇到的,因為錯誤狀況不夠明確,不過還好個人對ASP.NET還有信心,相信他不會胡亂出錯,應該是哪個地方搞錯了,後來經過測試,整個站台只有某個目錄下的頁面抓設定時會抓錯,既然有標的物了,開槍當然朝向那個方向去打囉,看了一下該目錄發現目錄下有另一個config檔:

image 這是個讓人振奮的消息,因為我們知道ASP.NET的web.config檔有所謂的繼承與覆寫的特性,詳細的參考資訊可以參考MSDN的文章:ASP.NET 組態檔階層架構和繼承

而我們擷取ASP.NET的組態繼承表來看一下,我們今天的繼承問題發生在『ASP.NET應用程式根目錄』與『ASP.NET應用程式子目錄』兩個組態層級間:

image

這個case的在站台根目錄跟子目錄的config中,不過一個的值是Global,另一個值是Local:

image 

我們分別執行根目錄與子目錄的網頁去取得這個Key(透過ConfigurationManager.AppSettings["Key1"]),會發現兩個程式取得的設定值不同,跟目錄取得的是Global,而子目錄取得的是Local,目前測試結果只有位於該子目錄或其子目錄下的網頁會讀取到Local的設定,其他的頁面則都維持正常,或簡單講,頁面會找到向父目錄去找尋web.config,最先找到的那個就會取用他的組態。

後來把這兩個地方同步後,一切就正常了,但我一直覺得這種繼承的方式不太保險,如果要區分不同設定,方式很多,不需要用這種方式,個人實在不建議這種做法,設定參數的部份統一放在一個地方就好,如果嫌web.config麻煩,也可以自己做設定功能,不過以單一專案角度來看,這種繼承概念提供了某種程度的靈活度,多了解也沒有壞處。

游舒帆 (gipi)

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