周末下了點狠心,決定把項目升級到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:\Windows\Microsoft.Net裡面的緩存目錄裡的,也就是跟用戶實際訪問頁面的時候csc.exe生成的是完全一致的。經過這一部,用戶兩次訪問的時候就不會有任何編譯動作發生了。
好累。順便想到一個無縫切換的方式,分別保留兩個網站,指向兩個不同的目錄,其中一個是沒有主機頭的,另一個是有主機頭的,用來更新的。更新這個有主機頭的網站以後,使用ASPnet_compiler編譯一下,然後切換兩個網站的主機頭,這樣新訪問的用戶就會被導向這個新編譯過的網站,而用戶不會感覺到任何延遲。下次再更新另外一個站點就可以了。
http://www.cnblogs.com/unfish/archive/2006/09/10/500230.Html