我們通過VS2005~VS2013(VS2015 沒有安裝,應該會延用),制作並發布網站,有預編譯和動態編譯兩種。
ASP.NET網站的預編譯
如果希望提高現有站點的性能並對站點執行錯誤檢查,那么此選項十分有用。可以通過預編譯網站來稍稍提高網站的性能。對於經常更改和補充ASP.NET網頁及代碼文件的站點則更是如此。在這種內容不固定的網站中,動態編譯新增頁和更改頁所需的額外時間會影響用戶對站點質量的感受。在執行就地預編譯時,將編譯所有的ASP.NET文件類型(HTML文件、圖形和其他非ASP.NET靜態文件將保持原狀)。隨后,ASP.NET將通過此文件夾中的程序集來完成頁請求。
那么在預編譯網站時,注意有一個選項是至關重要的,那就是“允許更新此預編譯站點”,這一項,默認情況下,前面是打上一個√的,至於要不要打上一個√,是可選的,那么,打勾與不打勾,有何區別呢?
也許大家都曾經發布過net網站,一般情況下,網站項目中的所有CS文件,會自動生成一個DLL動態鏈接庫,這就能夠很好的保護網站的源代碼,因為代碼一般都是放在CS文件里面的,既然都生成了DLL文件,那么,上傳到虛擬空間,別人就不能打開來看了!
但是,其它的文件,諸如ashx、aspx等文件,里面原來有什么,就是什么,別人可以打開這些文件來查看,盡管別人看不見CS代碼,但是仍然能夠看見ASPX文件里面的HTML代碼或部分服務器控件及相關的屬性;
還有,ashx這樣的文件,就相當於一個cs文件,里面的代碼也是能夠看見的。
因此,cs文件倒是安全了,但是網站中的ASPX、asxh等文件,是不安全的;對於整個網站而言,只有局部的安全,而沒有整體的安全。
那么,到底有沒有一種辦法,讓上傳到虛擬空間的網站文件,都安全呢?方法是有的,通過“允許更新此預編譯站點”這一項前面的√,就能實現;
①給“允許更新此預編譯站點”打√
如果您給此項打勾,然后發布網站,那么,結果是這樣的,整個網站文件,除了所有的CS文件編譯成為一個DLL文件之外,其它的文件,和原來的沒有任何變化,里面是什么,還是什么,只要別人通過記事本一打開,里面的代碼、HTML代碼等,都可以讓別人一覽無余。
除此之外,通過此種方式發布的網站,當用戶第一次訪問某個頁面的時候,需要經過編譯,查找BUG,之后,如果沒有任何錯誤,才能正常訪問,因此,速度會變得比較慢。(第二次、第三次……訪問,速度就正常了)
②取消“允許更新此預編譯站點”前面的√
如果您在發布網站的時候,取消了“允許更新此預編譯站點”前面的勾,那么,結果是這樣的:
1、網站里面的所有CS文件,都被編譯成為一個DLL文件;
2、除了cs文件,其它的文件,諸如ASPX、ASHX等文件,也一同被編譯起來,每個文件都在BIN目錄里面生成一個對應的*.compiled文件;
之后,如果您通過記事本查看ASPX、ASHX等文件,里面不會看到任何的代碼,就連HTML代碼標記都看不見,打開這樣的文件,里面只有一行文字,內容為“這是預編譯工具生成的標記文件,不應被刪除!”
但是,網站的訪問卻是正常的,不會出現任何不良的問題。
所以呢,使用這種方式發布網站,什么文件都不能通過記事本打開,里面顯示的都是一行文字,因此,網站文件就非常安全了。
此外,通過此種方法發布的網站,所有內容都編譯好了,打開的速度是很快的。
部署時不同文件類型對應的預編譯操作和輸出位置
文件類型 |
預編譯操作 |
輸出位置 |
.aspx、ascx、.master |
生成程序集和一個指向該程序集的.compiled文件。原始文件保留在原位置,作為完成請求的占位符 |
程序集和.compiled文件寫入Bin文件夾中。頁(去除內容的.aspx文件)保留在其原始位置 |
.asmx、.ashx |
生成程序集。原始文件保留在原位置,作為完成請求的占位符 |
Bin文件夾 |
App_Code文件夾中的文件 |
生成一個或多個程序集(取決於Web.config設置) |
Bin文件夾 |
未包含在App_Code文件夾中的.cs或.vb文件 |
與依賴於這些文件的頁或資源一起編譯 |
Bin文件夾 |
Bin文件夾中的現有.dll文件 |
按原樣復制文件 |
Bin文件夾 |
資源(.resx)文件 |
對於App_LocalResources或App_GlobalResources文件夾中找到的.resx文件,生成一個或多個程序集以及一個區域性結構 |
Bin文件夾 |
App_Themes文件夾及子文件夾中的文件 |
在目標位置生成程序集並生成指向這些程序集的.compiled文件 |
Bin文件夾 |
靜態文件(.htm、.html、圖形文件等) |
按原樣復制文件 |
與源中結構相同 |
瀏覽器定義文件 |
按原樣復制文件 |
App_Browsers |
依賴項目 |
將依賴項目的輸出生成到程序集中 |
Bin文件夾 |
Web.config文件 |
按原樣復制文件 |
與源中結構相同 |
Global.asax文件 |
編譯到程序集中 |
Bin文件夾 |
部署和更新時不同文件類型對應的預編譯操作和輸出位置
文件類型 |
預編譯操作 |
輸出位置 |
.aspx、ascx、.master |
對於具有代碼隱藏類文件的文件,生成程序集和一個指向該程序集的.compiled文件。將這些文件的單文件版本原封不動地復制到目標位置 |
程序集和.compiled文件寫入Bin文件夾中 |
.asmx、.ashx |
按原樣復制文件,但不編譯 |
與源中結構相同 |
App_Code文件夾中的文件 |
生成一個或多個程序集(取決於Web.config設置) |
Bin文件夾 |
未包含在App_Code文件夾中的.cs或.vb文件 |
與依賴於這些文件的頁或資源一起編譯 |
Bin文件夾
|
Bin文件夾中的現有.dll文件 |
按原樣復制文件 |
Bin文件夾 |
資源(.resx)文件 |
對於App_GlobalResources文件夾中的.resx文件,生成一個或多個程序集,以及一個區域性結構 對於App_LocalResources文件夾中的.resx文件,將它們按原樣復制到輸出位置的App_LocalResources文件夾中 |
程序集放置在Bin文件夾中 |
App_Themes文件夾及子文件夾中的文件 |
按原樣復制文件 |
與源中結構相同 |
靜態文件(.htm、.html、圖形文件等) |
按原樣復制文件 |
與源中結構相同 |
瀏覽器定義文件 |
按原樣復制文件 |
App_Browsers |
依賴項目 |
將依賴項目的輸出生成到程序集中 |
Bin文件夾 |
Web.config文件 |
文件被復制 |
與源中結構相同 |
Global.asax文件 |
編譯到程序集中 |
Bin文件夾 |
對文件進行更改后對網站的影響
文件類型 |
允許的更改(僅部署) |
允許的更改(部署和更新) |
靜態文件(.htm、.html、圖形文件等) |
可以更改、移除或添加靜態文件。如果ASP.NET網頁引用的頁或頁元素已被更改或移除,可能會發生錯誤 |
可以更改、移除或添加靜態文件。如果ASP.NET網頁引用的頁或頁元素已被更改或移除,可能會發生錯誤 |
.aspx文件 |
不允許更改現有的頁。不允許添加新的.aspx文件 |
可以更改 .aspx 文件的布局和添加不需要代碼的元素,例如,HTML元素和不帶有事件處理程序的ASP.NET服務器控件。還可以添加新的.aspx文件,該文件通常在首次請求時進行編譯 |
.skin文件 |
忽略更改和新增的.skin文件 |
允許更改和新增的.skin文件 |
Web.config文件 |
允許更改,這些更改將影響.aspx文件的編譯。忽略調試或批處理編譯選項。 不允許更改配置文件屬性或提供程序元素 |
如果所做的更改不會影響站點或頁的編譯(包括編譯器設置、信任級別和全球化),則允許進行更改。忽略影響編譯或使已編譯頁中的行為發生變化的更改,否則在一些實例中可能會生成錯誤。允許其他更改 |
瀏覽器定義 |
允許更改和新增文件 |
允許更改和新增文件 |
從資源(.resx)文件編譯的程序集 |
可以為全局和局部資源添加新的資源程序集文件 |
可以為全局和局部資源添加新的資源程序集文件 |
ASP.NET網站的動態編譯
為了使用應用程序代碼為用戶提出的請求提供服務,ASP.NET必須首先將代碼編譯成一個或多個程序集。程序集是文件擴展名為.dll的文件。可以采用多種不同的語言來編寫ASP.NET代碼,如Visual Basic、C#、J#和其他語言。當在編譯代碼時,會將代碼翻譯成一種名為Microsoft中間語言(MSIL)的與語言和CPU無關的表示形式。運行時,MSIL將運行在.NET Framework的上下文中,.NET Framework會將MSIL翻譯成CPU特定的指令,以便計算機上的處理器運行應用程序。
動態編譯應用程序代碼具有許多好處,其中包括:
— 性能。編譯后的代碼的執行速度要比諸如ECMAScript或VBScript的腳本語言快得多,因為它是一種更接近於機器代碼的表示形式,並且不需要進行其他分析。
— 安全性。編譯后的代碼要比非編譯的源代碼更難進行反向工程處理,因為編譯后的代碼缺乏高級別語言所具有的可讀性和抽象性。此外,模糊處理工具增強了編譯后的代碼對抗反向工程處理的能力。
— 穩定性。在編譯時檢查代碼是否有語法錯誤、類型安全問題,以及其他問題。通過在生成時捕獲這些錯誤,可以消除代碼中的許多錯誤。
— 互操作性。由於MSIL代碼支持任何.NET語言,因此可以在代碼中使用最初用其他語言編寫的程序集。例如,如果正在用C#編寫ASP.NET網頁,可以添加對使用Visual Basic編寫的.dll文件的引用。
以上文中有部分內容引用博客園心隨風若的文章