不要使用 Westwind.ApplicationConfiguration v2.20.0.0

使用 open source 函式庫的風險,久久碰到一次,卻也花了不少時間才找到問題....

2014-06-15 更新:Rick Strahl 知道此狀況後,已經把新版本上傳至 NuGet 伺服器。現在從 NuGet 伺服器取得的 v2.20.1.0 已經沒有本文提及的 bug 了。

先說結論:如果你跟我一樣有在使用 Westwind.ApplicationConfiguration 套件,千萬別用 NuGet 下載目前的 2.20.0.0 版。這會導致你的 ASP.NET 應用程式持續不斷的啟動和停止——每一次 HTTP request 處理完成後,應用程式就會自動結束。

原因在於 2.20.0.0 這個版本有個 bug,在讀取組態檔時,無論組態項目是否已經存在檔案中,它都會一律寫回組態檔。你知道的,web.config 一旦時間戳記改變,就會令 ASP.NET 應用程式結束。

在找兇手的過程中,一路註解掉不少自己寫的程式碼。最後範圍縮小到 Westwind.ApplicationConfiguration 的相關程式碼,這才發現每當我從瀏覽器發出一個 HTTP 請求,我的 ASP.NET 應用程式的 web.config 檔案時間戳記就被更新成目前時間。

為了重現問題,我到 GitHub 下載此套件的最新版本的原始碼,加入一些 logging 程式碼來觀察究竟哪裡出了問題。然而,卻怎麼也無法重現問題。這才發現,我從 GitHub 上面下載的原始碼,編譯出來的版本號碼是 2.20.1.0,而不是 NuGet 伺服器上的 2.20.0.0。

雖然作者 Rick Strahl 已經發現此問題,而且在 GitHub 上面最新版本的原始碼已經解決了,但我不明白為什麼他沒有將新版本發布至 NuGet 伺服器。這真的是個很嚴重的 bug 啊!

為了避免將來再出現類似問題,我到此專案的 GitHub 網頁,透過 New Issue 功能提交了一個建議:不要在 Read() 方法中呼叫 Write()。如此一來,就算將來因為 .NET Framework 有甚麼改動,也不致於再出現同一個問題。讀取操作還是只負責讀取資料就好,不該在背後偷偷執行寫入的動作。

在作者發布新版本至 NuGet 伺服器之前,一個解決辦法是下載 GitHub 上面的原始碼來編譯,並使用自己編譯的 DLL。又或者,從此放棄 Westwind.ApplicationConfiguration 套件,自己寫一個——這好像又有點因噎廢食了,畢竟這個套件真的挺方便。
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor