VS 2005提供了Wizard可以將ASP.NET 1.1 Project無痛升級成ASP.NET 2.0,讓人覺得二者似乎沒啥不同,直到你將網站部署到正式環境時,才會發現人事己非。

在ASP.NET 1.1中,VS.NET 2003預設是用Code-Behind的方式,將所有的aspx的.cs Build成單一顆DLL,若要更新cs時,Rebuild再把dll Copy到正式機即可。如果你還想用這種方式處理ASP.NET 2.0網站的更新,包你傻眼!

ASP.NET 2.0在Code-Behind的概念上悄悄地做了大改變! 首先,ASP.NET 2.0用的是Code-Beside,而不是Code-Behind,也就是.cs直接放在網站上,使用者瀏覽頁面時才動態Complie。這樣的好處是,當你要改.cs的程式時,不須要重新Build DLL出來,只要直接改.cs的內容即可。(又回到ASP時代的方便性了,真是十年河東、十年河西...) 當然,大家馬上想到,那程式碼豈不被看光光?? 這就是方便的代價,如果你要保護.cs的程式邏輯不外露,則ASP.NET 2.0提出了一種Precompiled Web Site的概念(完整的Precompilation Model說明比較可以看這裡),就比較接近原來Code-Behind的精神。.cs會被事先Compile成DLL,這樣就只要部署aspx與dll到正式台上就可以了。

我們看一下,Code-Beside的網站會長成這樣:

(注意: 在ASP.NET 2.0中,與ASPX無關的獨立.cs要放在App_Code目錄下)
Precompiled Site則像這樣: (每個目錄一個.dll)


而要部署ASP.NET 2.0的網站到正式環境,有四種選擇:

1) XCOPY: 就是直接將檔案COPY過去,但預設的Code-Beside方式會有.cs外露的問題
2) Copy Web Site: VS 2005內建的工具,可以比對檔案新舊作同步,也可指定同步特定的Folder、File,但一樣有Code-Beside的.cs外露Issue。
3) Publish Web: VS 2005會進行Precompile的動作,並將aspx, dll檔案複製到遠端的主機上。但是,我們沒法選擇只更新某幾個檔案,一律全部覆寫!! (包含web.config,
額外Copy過去的東西也會被幹掉)
4) Build Setup Project: 建立一個專案,產生MSI自動安裝檔,但如果並不打算做大量部署時,這有點殺雞用牛刀的嫌疑。

老實說,以上三種方法中,3)比較接近實務的需求,但是每次都要"全站更新"的設計叫人不敢恭維,網路上不少人抱怨這一點,也有些改良的建議。其中我覺得較可行的方式是先Publish Web到Local Disk後,再選擇只Copy其中部分檔案到正式機。暫時我會先採行這種做法,等待將來有方便的Add-On或工具問市再說。(Publish Web Site時有個選項是"Use fixed naming and single page assembllies"[參見下方的圖],則每個ASPX會有其獨立的DLL,名稱也會包含ASPX的名稱以資識別,這有利於我們只更新單一的ASPX或其.CS邏輯,在實務上可以減少更新時Web Application需要重新啟動的範圍。但是網站大而ASPX很多時,DLL數目會多到嚇人是一大缺點。)

最後補充一點,Precompiled Site還有一種特異功能,可以連aspx的內容都全部藏起來,網站上放的aspx會是只有一行文字的空殼子,這應該是保密到家的最高境界了,做法是在Publish Web Site時,取消"Allow this precompiled site to be updatable"。


Comments

# by steve

沒玩過ASP.NET2.0(其實是連1.1都沒在玩)<BR/>不過覺得有點納悶<BR/>Code Beside的作法,豈不是否定了以前在1.1說的<BR/>先compile好速度會比較快的說詞嗎<BR/>而且.....覺得好像在學JSP的感覺.....

# by 阿傻

請問一下ASP.NET2.0或者之後的版本 最安全的佈署方式 是把CS放在網站上還是跟1.1一樣編譯成一個DLL 還是一個aspx就一個dll 我是剛入門的初學者 這個問題困惑我很久了!~ 希望大大能幫我解答一下 感激

# by Jeffrey

to 阿傻, cs放在網站最大的好處的一次可以只修改一個aspx,而且一按儲存就立即生效,但缺點是Source Code會直接外露。 一個ASPX Build一個dll,在大型網站上會讓BIN目錄下出現成千個dll檔(尤其是檔名中還有隨機產生的部分,不易識別管理),同時dll數太多時,會影響載入效率。 在實務上,我個人偏好正式機器的部署一個目錄Build一顆DLL,如此單一ASPX的更新只會影響同一目錄下的ASPX重啟,避免傳統1.1一更新就得全站重啟。開發測試階段則以.cs並列方式以利修改更新。

# by 阿傻

感謝Jeffrey 的說明 那再請問你一個問題 在VS2008裡面該如何設定 您說的"一個目錄Build一顆DLL" 我點發行網站跟建置網站好像都沒辦法耶 是不是哪些地方要做設定呢? 謝謝

# by Jeffrey

To 阿傻, 一個目錄Build一顆DLL可以使用Web Deployment Project達成,相關細節可以參考我的另一篇文章。 http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/02/22/588.aspx

# by saintchou

您好: 我用 VS 2005 再發行 Web 時 為什麼 看不到「Allow this precompiled site to be updatable」這個選項,而且發行的畫面跟您貼的不太一樣 謝謝

# by Jeffrey

to saintchou, 要不要貼一張你看到的畫面連結,大家來幫你研判一下。

# by saintchou

Jeffrey 您好: 謝謝您的熱心幫助 我用 VS 2005 SP1 ,在發行 Web 時,卻長下面這樣的畫面,看不到 precompiled 的選項 http://img90.imageshack.us/img90/4066/30477161pi3.jpg 謝謝您 祝您 新春如意

# by Jeffrey

to saintchou, 你選用的專案類型是Web Application Project,與文中討論部署有點機車的Web Site Project不同。我寫了篇補充說明: http://tinyurl.com/dmvnzd

# by saintchou

Dear Jeffrey, 謝謝您解決的我的問題 還寫一篇這麼清楚的文章來 解釋 Web Application Project 與 Web Site Project 感謝

# by jason

您好 這篇文章真是太精彩了 想跟您請教 Web Application Project 有沒有辦法像 Web Site Project 把 .aspx檔的 HTML 內容都放進DLL裡 我用 VS 2008 謝謝

# by jason

我剛剛用 VS 2008 測試一下 2008 的 Web Site Pro 沒有辦法把 .aspx 的內容放進 dll 中,2005 卻可以 請問是 2008 沒有這功能了,還是我的步驟有錯誤 謝謝

# by Jeffrey

to jason, 你說的aspx放進dll裡,指的是文章最後一張圖的那個效果嗎? 在VS2008裡一樣有Allow this precompiled site to be updatable的選項。

# by jason

Dear Jeffrey, 是的,就是最後一張圖的效果 我看到 VS2008 也有這個選項了,謝謝 請問 如果是 Web Application Project 是不是就沒有辦法做到最後一張圖的那個效果 謝謝

Post a comment