週末下了點狠心,決定把項目升級到2.0平台,因為VS2003和2005可以並存,所以問題還是比較容易處理的,裝上Pro版的2005,打開原來的項目,自動出現升級嚮導。項目裡包含7個子項目,所有的邏輯和顯示都是在後台項目裡實現的,前台的Web項目裡每個文件裡都只是實現了一個對後台方法的調用,而且後台也沒有用到任何高級的語法,因此升級非常平滑。
總結了一下,Web專案裡的專案文件被刪除了。原來兩個不相干的ASPX檔也被考慮進編譯過程了。編譯了一下,上傳到伺服器上,報錯。後來發現新編譯的專案沒有Web專案的Dll了,而伺服器的目錄上還留著。結果造成內部引用的混亂。刪除那個舊的Web項目的Dll,OK了。
然後打算試試看發布模式,用VS2005的生成選單專案裡的發佈網站功能,設定發佈到的目錄,選項設成不允許更新,它居然把Web目錄下所有的東西複製了一遍出來,所以編譯過程很慢。編譯完成以後在bin目錄下產生了一堆東西,我以為把這些東西拷到伺服器上就可以不用乾淨編譯了。結果發現第一次造訪頁面的時候,還是會出現csc進程。整個網站切換過來以後,還是同樣出現了一堆的csc進程,不過編譯過程比原來快了一點。
另外出現的一個比較嚴重的問題,程式似乎過一會就會自動重啟一下,導致再編譯一次,而且後來發現伺服器上出現了一個錯誤窗口,說是w3wp.exe進程出現錯誤,是否要進行調試。選擇取消以後,w3wp.exe就自動重啟了,於是又開始了新一輪的重新編譯。這個過程出現了三次,嚇的我趕緊切換回去1.1的版本。到事件檢視器裡看了一下,裡面一堆的未處理異常,基本上都是一個值為空的錯誤。奇怪了,在1.1的時候沒有出現過問題啊,而且程式碼沒有改變。
後來查到一篇文章(中文的似乎還沒有人提到過),http: //www.eggheadcafe.com/articles/20060305.asp ,在2.0裡面對未處理的異常的處理方式跟1.1有很大的不同,1.1會忽略它,除非影響頁面產生。而2.0會導致進程報錯,直接影響整個網站運作。聽起來是個很嚴重的問題,但是這樣似乎比較合理,否則程式設計師會一直忽略掉這個錯誤。然而因為這個問題,網站無法切換也是個很嚴重的問題,因此,還是需要一個平滑過度的方法。上文提到了這個方法,就是自己寫一個HttpModule,處理所有的未處理異常,並且可以把異常訊息記入系統事件,有利於程式設計師進行處理。並且上文也提供了這個HttpModule的源碼和二進位檔案下載,還包含Demo的WebApp。
今天終於弄清楚了2.0的預先部署發布的編譯方式,用VS的發佈網站的方式是不對的,一定要用aspnet_compiler.exe來手動編譯,而且它的編譯過程是針對網站的實際設定的。也就是說,必須把Web專案的內容上傳到網站上去,在IIS裡面設好網站的路徑,然後使用aspnet_compile進行編譯,可以進行本地編譯,這個過程其實它是把生成的dll放到C: WindowsMicrosoft.Net裡面的快取目錄裡的,也就是跟使用者實際存取頁面的時候csc.exe產生的是完全一致的。經過這一部,用戶兩次造訪的時候就不會再有任何編譯動作發生了。
好累。順便想到一個無縫切換的方式,分別保留兩個網站,指向兩個不同的目錄,其中一個是沒有主機頭的,另一個是有主機頭的,用來更新的。更新這個有主機頭的網站以後,使用aspnet_compiler編譯一下,然後切換兩個網站的主機頭,這樣新訪問的用戶就會被導向這個新編譯過的網站,而用戶不會感覺到任何延遲。下次再更新另外一個站點就可以了。
http://www.cnblogs.com/unfish/archive/2006/09/10/500230.html