[ASP.NET]簡述網站使用原始碼與發行後的dll差異

最近剛好有網友詢問這個問題,當我們要把我們的系統上線,可以直接把原始碼放到Server上,也可以先行【建置→發行】,再將發行後的aspx+dll放到主機中。到底這兩個方式有什麼不同??運作速度、安全性、維護方便性到底如何呢??小喵就小喵所知道的,分享給各位網友們。

緣起

最近剛好有網友詢問這個問題,當我們要把我們的系統上線,可以直接把原始碼放到Server上,也可以先行【建置→發行】,再將發行後的aspx+dll放到主機中。到底這兩個方式有什麼不同??運作速度、安全性、維護方便性到底如何呢??小喵就小喵所知道的,分享給各位網友們。

 

運作的流程

字不如表,表不如圖。所以小喵把運作的過程,兩種方式的比較,做成兩張圖。先來看看這兩張圖,再來進一步做一些文字的補充吧。

(所有的圖都可以點圖放大,如果看不清楚的部分就煩請將圖放大看)

首先是當某一支aspx被呼叫時,兩種方式的運作過程如下圖

投影片5

當第一次被呼叫,這兩種方式不同的地方,如果您放的是原始檔,那麼該原始檔必須先被經過【編譯】的程序,才能轉換成可在記憶體中執行運作的中間檔。而這個過程是動態的,用到哪個才編譯哪個。而已發行的因為之前已經將相關的編譯過了,就略過這個步驟,直接將編譯的結果(.dll)載入記憶體中運作。其中運作完後,並不會馬上把該程式從記憶體中釋放,這樣的機制有助於當地二次以後被呼叫,可以省略過再次編譯、載入的動作。直接從記憶體中的已經被載入存放好的程式區塊中直接運作執行。

接著來看第二次以後被呼叫的狀況

投影片6

這裡原始碼的部分小喵少了一點東西,ASP.NET為了可以每次在程式碼有變更後,執行運作最新的結果,會去偵測原始碼是否與記憶體中上次編譯的是否相同。如果不同,就會等同地一次執行,會直接再次的重新編譯,載入記憶區塊。這也是為什麼我們每次修改過程式碼後,發現運作的是修改程式碼後的結果。

假設程式碼沒有被變更的情況,就如同上圖一般,兩種方式運作的過程幾乎相同。

 

兩種方式的比較表

小喵針對這兩個方式,在維護方式、維護方便性、安全性、運作速度上,做了一個比較表

投影片7

 

維護方式:

使用原始碼確實方便很多很多,因為如果要修改東西,只需要將原始碼以文書處理軟體叫出來(記事本也可),修改後儲存即可。如果在別處更改好的,也只要把修改後的原始碼覆蓋掉原來的就可以了。

但是如果是用發行的方式,那麼每次修改後,都必須經過【建置→發行】的過程,將相關程式轉為.dll,然後再將該dll複製貼到主機上覆蓋原來檔案。所以對於維護方式,有很大的不同,使用發行的方式,要做的事情還不少哩。

維護便利性:

剛剛提到,如果方原始碼,只需要用文書處理軟體開起來改,改好後儲存即可使用。但是如果是原始碼,卻必須都測試好後,先行建置,建置沒問題,還需要做發行(小喵自己大都是發行到個人PC上),最後才將發行出來的aspx+dll覆蓋到主機上。因此光就便利性而言,原始碼方便很多很多。

安全性:

由於放原始碼所代表的內容都是明碼,因此如果萬一被取得原始碼,很容易的就可以知道您做了哪些事,也可能會被分析出進一步如何駭掉這個網站。而做過建置發行的,原始碼裡面已經沒了那些程式碼,取而代之的是一隻隻的.dll程式,就算要用反組譯的方式去看,也需要花費許多的時間或精力。因此就安全性而言,有閒置與發行的相對的安全一些。

第一次使用的速度:

由於第一次使用如果是原始碼,還必須透過動態編譯的步驟,才能轉為可執行的東西。所以運作上當然會比已經編譯過,可以直接將dll載入記憶體中的要慢上一些。

 

使用方式的選擇

以上是對於存放在主機上的兩種方式【原始碼方式】【建置發行方式】的簡略介紹,小喵沒有談得很深入,也沒有對細節很專研的去解釋,大致上需要考量的點,小喵把他們點了出來。

有了以上的概念後,看來各有各的優缺點,那麼到底要怎麼樣選擇比較合適呢??小喵提供一些方向讓大家參考判斷的方向。

  1. 對外部的網站/系統:外部網站系統安全性的考量應該要提高,因此如果對外的網站系統,小喵的建議是使用安全性較高的【建置發行】方式。
  2. 對內部的網站/系統:如果這系統是內部的使用者要用的,並沒有對外,那麼如果考量維護的簡便,以及對應使用者需求的調整,或許可以選擇直接存放原始碼。這樣雖然使用者在地一次使用會比較慢,但是在於使用者需求變更的對應,會比較容易修改與維護。因此小喵的建議是,對內的網站/系統,可以使用原始碼的方式。

以上是簡單的建議思考方向,實際上還是要針對自己的狀況,來決定安全性、運作速度、維護簡便否進行考量與取捨。

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6)