對於寫網頁的朋友而言, 或許和我一樣, 最害怕的問題就是, 在冗長的開發過程中解決了很多疑難雜症, 一路打通關之後, 卻在終於要發行到目標網站時, 才發生問題。這就像千辛萬苦爬上了 101 的頂樓, 才發現門竟然打不開。
發行後才發生的問題, 通常不容易找到問題的發生原因, 也不容易解決。主要是因為一旦發行之後, 目標機器上沒有除錯的環境, 而且目標機器上的環境配置通常跟開發環境不一樣。另外, 還有可能就像我在下面提到的問題一樣, 當問題發生時, 恐怕連錯誤訊息都是錯誤的。
我今天在將網站發行後看到的問題是這樣的:
在發行之前, 我可以確定這個問題是不存在的。在這裡的這個 MissingMethodException, 簡直是莫名其妙。因為這個找不到的 ReadAll() 方法, 並不是動態載入的。它甚至是一個靜態方法; 如果這個方法找不到, 它甚至無法通過編譯, 更別提它能通過編譯, 甚至發行成功了。
不過, 這個方法確實是位於另一個 assembly 裡面; 它事實上是屬於另一個專案的方法。我檢查過好幾遍, 確定對應的 assembly 確也被拷貝到 bin 資料夾裡面, 也有順利發行到目標機器的對應位置。它真的不可能不被找到, 因為位於同一個 assembly 裡的其它方法都能被找到, 而且正確執行了!
不過我想到一點: 這個被找不到的方法, 是我剛剛才寫的。一定是發行時發生什麼問題, 使得該方法的位址未被列在參考裡面。
於是, 解決問題的方法異常地簡單: 把方案中的 bin 資料夾清乾淨, 把目標機器的舊檔案也清乾淨, 然後將方案做一次重新建置, 再發行一次, 這個問題就不再出現了!
沒有留言:
張貼留言