­

ASP.NET Web項目發布選項:「允許更新此預編譯站點」 詳解

  • 2019 年 10 月 3 日
  • 筆記

#使用visual studio 發布web項目

我們使用visual studio 可以通過如下的方法發布web網站:
在這裡插入圖片描述
在打開的對話框中,有一個選項至關重要,那就是:「允許更新此預編譯站點
允許更新此預編譯站點」這一項,是可選的,那麼,選中與不選中,有何區別呢?

#"允許更新此預編譯站點" 選項的意義

我們在發布 .Net web項目時,一般情況下,項目中所有的.CS文件,會自動生成DLL動態鏈接庫,這就能夠很好的保護網站的源程式碼,因為服務端程式碼一般都是放在.CS文件裡面的,既然都生成了DLL文件,那麼,上傳到伺服器,別人就不能輕易打開來看了!

但是,其它的文件,諸如ashx、aspx等文件,裡面原來有什麼,就是什麼,別人可以打開這些文件來查看,儘管別人看不見CS程式碼,但是仍然能夠看見ASPX文件裡面的HTML程式碼或部分伺服器控制項及相關的屬性;ashx這樣的文件,就相當於一個cs文件,裡面的程式碼也是能夠輕易看見的;

因此,.CS文件安全了,但是ASPX、ashx等文件,就不安全了;
那麼,到底有沒有一種辦法,讓上傳到伺服器的web文件,都安全呢?方法是有的,就是發布的時候,不選中 「允許更新此預編譯站點」;

1、選中 「允許更新此預編譯站點」

如果發布web的時候,選中「允許更新此預編譯站點」,那麼,結果是這樣的:
整個網站文件,除了所有的CS文件編譯成為DLL文件之外,其它的文件,和原來的沒有任何變化,裡面是什麼,還是什麼,只要別人通過記事本一打開,裡面的程式碼、HTML程式碼等,都可以讓別人一覽無餘。

除此之外,通過此種方式發布的網站,當用戶第一次訪問某個頁面的時候,需要經過編譯,查找BUG,之後,如果沒有任何錯誤,才能正常訪問,因此,速度會變得比較慢。之後的訪問就正常了;

2、不選中 「允許更新此預編譯站點」

如果在發布web的時候,不選中「允許更新此預編譯站點」,那麼,結果是這樣的:
1、網站裡面的所有CS文件,都被編譯成為DLL文件;
2、除了cs文件,其它的文件,諸如ASPX、ASHX等文件,也一同被編譯起來,每個文件都在BIN目錄裡面生成一個對應的*.compiled文件;

之後,如果您通過記事本查看ASPX、ASHX等文件,裡面不會看到任何的程式碼,就連HTML程式碼標記都看不見,打開這樣的文件,裡面只有一行文字,內容為「這是預編譯工具生成的標記文件,不應被刪除!」,且這些文件的大小都為1kb;
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
這樣的結果看著有點詭異,但是,web的訪問卻是正常的,不會出現任何不良的問題。
所以呢,使用這種方式發布web,ashx、aspx等文件都不能通過記事本打開,裡面顯示的都是一行文字,因此,網站文件就非常安全了。
此外,通過此種方法發布的網站,所有內容都編譯好了,打開的速度是很快的。

3、Asp.Net MVC 的web項目也有同樣的結果

在這裡插入圖片描述
在這裡插入圖片描述

#當本地的web文件發生修改的時候,需要更新哪些文件到伺服器;

1、如果發布方式,選中了「允許更新此預編譯站點」;

  • 如果修改的是aspx或cshtml等網頁文件,那隻需更新發布後的aspx文件到伺服器;
  • 如果修改的是aspx.cs文件,那需要將bin下的對應的dll更新到伺服器;
  • 如果修改的是ashx文件,那隻需要將ashx文件更新到伺服器;

2、如果發布方式,沒選中「允許更新此預編譯站點」;

  • 如果修改的是aspx或cshtml等網頁文件,那需要將對應的DLL文件及.compiled文件都更新到伺服器,而aspx文件不需要更新到伺服器;
  • 如果修改的是aspx.cs文件,那需要將bin下的對應的dll更新到伺服器;
  • 如果修改的是ashx文件,那需要將對應的DLL文件及.compiled文件都更新到伺服器,而ashx文件不需要更新到伺服器;

3、報錯:未預編譯文件「xxx.aspx」,因此不能請求該文件。

在這裡插入圖片描述
或者報錯「xxx.aspx has not been pre-compiled, and cannot be requested.」
原因:
發布方式,沒選中「允許更新此預編譯站點」,將某個頁面的dll替換到了,發布方式為選中「允許更新此預編譯站點」 的web伺服器了;
也就是,發布方式設置不同,更新文件導致的報錯;

#參考

https://www.cnblogs.com/LifeKingcn/archive/2012/09/15/2686579.html