ASP.NET網站或ASP.NET Web應用程序?


當我在Visual Studio中啟動一個新的ASP.NET項目時,我可以創建一個ASP.NET Web應用程序,或者我可以創建一個ASP.NET Web站點。

ASP.NET Web應用程序和ASP.NET網站有什麼區別? 為什麼我會選擇其中一個呢?

答案根據我使用的是哪個版本的Visual Studio而不同?



Answers



網站:

網站項目是即時編譯的。 你最終得到更多的DLL文件,這可能是一個痛苦。 當一個目錄中的頁面或控件需要引用另一個目錄中的頁面和控件時,也會出現問題,因為另一個目錄可能尚未編譯成代碼。 另一個問題可以在出版。

如果不告訴Visual Studio不斷重複使用相同的名稱,它會為由頁面生成的DLL文件始終提供新的名稱。 這可能會導致幾個包含相同的類名的DLL文件的密切副本,這將產生大量的錯誤。 網站項目是在Visual Studio 2005中引入的,但結果並不是非常流行。

Web應用程序:

Web應用程序項目是作為外接程序創建的,現在作為Visual Studio 2005 SP 1的一部分存在。主要區別在於Web應用程序項目的設計工作與Visual Studio 2003附帶的Web項目相似。它將在構建時將應用程序編譯成單個DLL文件。 為了更新項目,必須重新編譯並發布DLL文件以進行更改。

Web應用程序項目的另一個不錯的功能是從項目視圖中排除文件更加容易。 在“網站”項目中,排除的每個文件都使用文件名中的排除關鍵字進行重命名。 在Web應用程序項目中,項目只是跟踪哪些文件包含/從項目視圖中排除,而無需重命名,使事情更加整潔。

參考

文章ASP.NET 2.0 - 網站與Web應用程序項目也給出了為什麼要使用一個,而不是其他的理由。 這是它的摘錄:

  • 您需要將大型Visual Studio .NET 2003應用程序遷移到VS 2005? 使用Web應用程序項目。
  • 你想打開和編輯任何目錄作為一個Web項目,而無需創建一個項目文件? 使用網站項目。
  • 您需要在編譯期間添加預構建和後構建步驟? 使用Web應用程序項目。
  • 您需要使用多個Web項目來構建Web應用程序? 使用Web應用程序項目。
  • 你想為每個頁面生成一個程序集? 使用網站項目。
  • 你更喜歡動態編譯和在頁面上工作,而不是在每個頁面視圖上構建整個站點? 使用網站項目。
  • 你更喜歡單頁面的代碼模型到代碼隱藏模型? 使用網站項目。

Web應用程序項目與網站項目 (MSDN)解釋了網站和Web應用程序項目之間的差異。 另外,它討論了在Visual Studio中進行的配置。




網站是您部署到ASP.NET Web服務器(如IIS)的內容。 只是一堆文件和文件夾。 網站中沒有任何內容將您與Visual Studio聯繫在一起(沒有任何項目文件)。 代碼生成和網頁編譯(如.aspx,.ascx,.master)是在運行時動態完成的,對這些文件的更改由框架檢測並自動重新編譯。 你可以把你想要在兩個頁面之間共享的代碼放在特殊的App_Code文件夾中,或者你可以預編譯它,並把程序集放到Bin文件夾中。

Web應用程序是一個特殊的Visual Studio項目。 與Web站點的主要區別在於,當您構建項目時,所有的代碼文件都被編譯到一個單獨的程序集中,該程序集位於bin目錄中。 您不要將代碼文件部署到Web服務器。 您可以將它們放在任何位置,而不必像共享代碼文件那樣使用特殊文件夾。 由於Web應用程序包含不想部署的文件(如項目和代碼文件),因此Visual Studio中有一個“ 發布”命令,用於將Web站點輸出到指定的位置。

App_Code vs Bin

部署共享代碼文件通常是一個壞主意,但這並不意味著您必須選擇Web應用程序。 您可以有一個網站,引用一個類庫項目,其中包含網站的所有代碼。 Web應用程序只是一個方便的方法。

代碼隱藏

本主題特定於.aspx和.ascx文件。 本主題在新的應用程序框架(如不使用代碼隱藏文件的ASP.NET MVC和ASP.NET Web頁面)中逐漸減少。

通過將所有代碼文件編譯為單個程序集,包括.aspx頁面和.ascx控件的代碼隱藏文件,在Web應用程序中,您必須重新構建每個小改動,而且不能進行實時更改。 在開發過程中,這可能是一個真正的痛苦,因為您必須不斷重新構建以查看更改,而Web站點更改由運行時檢測到,並且頁面/控件將自動重新編譯。

讓運行時管理代碼隱藏程序集對於你來說是一件小事,因為你不需要擔心賦予頁面/控件唯一的名字,或者把它們組織到不同的名字空間中。

我並不是說部署代碼文件總是一個好主意(特別是不是在共享代碼文件的情況下),但代碼隱藏文件應該只包含執行特定於UI的任務,線程事件處理程序等的代碼。您的應用程序應該是分層,以便重要的代碼總是在Bin文件夾中。 如果是這種情況,那麼部署代碼隱藏文件不應該被認為是有害的。

Web應用程序的另一個限制是您只能使用該項目的語言。 在Web站點中,您可以在C#中使用一些頁面,在VB中使用一些頁面等。不需要特殊的Visual Studio支持。 這是構建提供程序可擴展性的優點。

此外,在Web應用程序中,由於編譯器僅編譯代碼隱藏類,而不是編譯代碼(在MVC中,您可以使用MvcBuildViews選項修復此問題),因此在運行時編譯時不會在頁面/控件中檢測到錯誤。

視覺工作室

由於Web應用程序是Visual Studio項目,因此您將獲得Web站點中不可用的一些功能。 例如,您可以使用構建事件來執行各種任務,例如縮小和/或組合JavaScript文件。

在Visual Studio 2010中引入的另一個不錯的功能是Web.config轉換 這在網站中也是不可用的。 現在在VS 2013中使用網站。

構建Web應用程序比構建Web站點要快,特別適用於大型站點。 這主要是因為Web應用程序不編譯標記代碼。 在MVC中,如果您將MvcBuildViews設置為true,那麼它將編譯標記代碼,並獲得錯誤檢測,這非常有用。 不利的一面是,每次構建解決方案時,都會構建完整的網站,這可能會很慢且效率低下,尤其是如果您不在編輯網站。 我發現自己打開和關閉MvcBuildViews(這需要一個項目卸載)。 另一方面,通過網站,您可以選擇是否將網站構建為解決方案的一部分。 如果您選擇不這樣做,那麼構建解決方案的速度非常快,您可以隨時單擊“網站”節點,然後選擇“構建”(如果已經進行了更改)。

在一個MVC Web應用程序項目中,您有常見任務的額外命令和對話框,比如“添加視圖”,“轉到視圖”,“添加控制器”等。這些在MVC網站中不可用。

如果使用IIS Express作為開發服務器,則可以在Web站點中添加虛擬目錄。 該選項在Web應用程序中不可用。

NuGet軟件包還原在網站上不起作用,您必須手動安裝packages.config中列出的軟件包 Package Restore現在可以在網站上啟動NuGet 2.7




網站 =由平面設計師創建網站時使用,程序員只編輯一兩頁

Web應用程序 =在程序員創建應用程序時使用,圖形設計師只編輯一個或兩個分頁/圖像。

網站可以使用任何HTML工具,而無需開發者工作室,因為項目文件不需要更新等。當團隊主要使用開發者工作室並且存在高代碼內容時,Web應用程序是最好的。

(在編譯時在Web應用程序中發現了一些編碼錯誤,直到運行時才在網站中找到)。

警告: 我多年前寫了這個答案,並沒有使用Asp.net。 我預料現在事情已經轉移。




除非您特別需要動態編譯的項目, 否則請勿使用網站項目

為什麼? 因為網站項目會在您嘗試更改或理解您的項目時將您推上牆。 Visual Studio中的靜態類型查找功能(例如,查找用法,重構)將永遠在任何合理大小的項目上運行。 有關更多信息,請參閱Visual Studio中的“查找所有引用”緩慢的堆棧溢出問題。

我真的不明白為什麼他們放棄了Visual Studio 2005中的Web應用程序,因為這個網站的工作類型是令人痛苦的,完整的,生產力高的網站項目類型。







這可能聽起來有點顯而易見,但是我認為這是誤解,因為Visual Studio 2005最初只與網站一起提供。 如果您的項目處理的網站相當有限,並沒有太多的邏輯或物理分離,網站是好的。 但是,如果它真的是一個具有不同模塊的Web應用程序,許多用戶添加和更新數據,那麼最好使用Web應用程序。

網站模型最大的app_codeapp_code部分中的任何內容都是動態編譯的。 您可以在不進行完全重新部署的情況下進行C#文件更新。 然而,這是一個很大的犧牲。 很多事情發生在難以控制的封面之下。 由於一切都是動態編譯的,所以命名空間很難控制,並且默認情況下,特定的DLL使用情況會在app_code任何地方出現。

Web應用程序模型沒有動態編譯,但您可以控制我提到的事情。

如果您正在進行多層開發,我強烈建議使用Web應用程序模型。 如果您正在進行有限的網站或快速而骯髒的實施,則網站模型可能具有優勢。

更詳細的分析可以在:




從MCTS自學培訓套裝考試70-515書:

隨著Web應用程序(項目),

  1. 你可以創建一個MVC應用程序。
  2. Visual Studio將文件列表存儲在項目文件(.csproj或.vbproj)中,而不是依賴文件夾結構。
  3. 您不能混合使用Visual Basic和C#。
  4. 如果不停止調試會話,則無法編輯代碼。
  5. 您可以在多個Web項目之間建立依賴關係。
  6. 您必須在部署之前編譯應用程序,這樣可以防止在另一個頁面無法編譯時測試頁面。
  7. 您不必將源代碼存儲在服務器上。
  8. 您可以控製程序集名稱和版本。
  9. 部署後無法編輯單個文件而無需重新編譯。



這取決於你正在開發的東西。

內容導向型網站的內容會經常變化,而網站則會更好。

應用程序傾向於將其數據存儲在數據庫中,而其頁面和代碼很少會發生更改。 在這種情況下,最好有一個Web應用程序,在這個應用程序中,組件的部署更加可控,並且對單元測試有更好的支持。




Compilation首先Compilation有所不同。 Web站點不在服務器上預編譯,而是在文件上編譯。 這可能是一個優勢,因為當你想改變你的網站的東西,你可以從服務器下載一個特定的文件,改變它,並上傳這個文件回服務器,一切工作正常。 在Web應用程序中,你不能這樣做,因為everthing是預編譯的,你最終只有一個DLL。 當你在項目的一個文件中改變某些東西時,你必須重新編譯一切。 所以,如果你想有可能改變服務器上的一些文件網站是更好的解決方案。 它還允許許多開發人員在一個網站上工作。 另一方面,如果您不希望代碼在服務器上可用,則應該選擇Web應用程序。 這個選項對於單元測試來說也更好,因為在發布你的網站之後創建了一個DLL文件。

Project structure也有所不同。 在Web應用程序中,您有一個項目文件,就像您在正常的應用程序中一樣。 在網站上沒有傳統的項目文件,只有解決方案文件。 所有的參考和設置都存儲在web.config文件中。 @Page directive對於包含與此頁面關聯的類的文件,@Page @Page directive有一個不同的屬性。 在Web應用程序中,它是標準的“CodeBehind”,在網站中使用“CodeFile”。 你可以在下面的例子中看到這個:

Web Application:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"  
Inherits="WebApplication._Default" %>  

網站:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

命名空間 - 在上面的例子中,你可以看到另一個區別 - 如何創建命名空間。 在Web應用程序中,命名空間只是項目的名稱。 在網站中有動態編譯頁面的默認命名空間ASP。

編輯並繼續 - 在Web應用程序編輯並繼續選項是可用的(要打開它,你必須去工具菜單,單擊選項,然後找到編輯並繼續調試)。 此功能不能在Web Site.ASP.NET MVCIf中使用,您要開發Web應用程序

ASP.NET MVC(模型視圖控制器)最好的和默認的選擇是Web應用程序。 儘管可以在網站中使用MVC,但並不推薦。

總結 - ASP.NET Web應用程序和網站之間最重要的區別是編譯。 所以如果你在一個更大的項目上工作,那裡有幾個人可以修改它,最好使用網站。 但是如果你正在做一個更小的項目,你也可以使用Web應用程序。




其中一個主要區別是網站動態編譯並創建即時組件。 網絡應用程序編譯成一個大的程序集。

兩者之間的區別已經在Visual Studio 2008中取消了。




是的,Web應用程序比Web站點好得多,因為Web應用程序給了我們自由:

  1. 將多個項目集中在一起,並建立項目之間的依賴關係。 例如,對於PCS,我們可以在Web應用程序

    • 門戶網站
    • 通知控制器(用於發送電子郵件)
    • 業務層
    • 數據訪問層
    • 異常管理器
    • 服務器工具
    • WCF服務(適用於所有平台)
    • 項目清單
  2. 對與ASP.NET頁面關聯的類文件中的代碼運行單元測試

  3. 引用那些與獨立類的頁面和用戶控件相關的類
  4. 為整個站點創建一個程序集
  5. 控制為該站點生成的程序集名稱和版本號
  6. 避免將源代碼放在生產服務器上。 (您可以避免將源代碼部署到IIS服務器,在某些情況下,如共享主機環境,您可能會擔心未經授權訪問IIS服務器上的源代碼(對於網站項目,您可以通過以下方式避免此風險在開發計算機上進行預編譯,然後部署生成的程序集,而不是源代碼。但是,在這種情況下,您將失去輕鬆進行網站更新的一些好處。
  7. 與網站的性能問題(對網站的第一個請求可能需要編譯網站,這可能會導致延遲。如果網站運行在內存不足的IIS服務器上,包括整個網站單個程序集可能會使用比多個程序集所需更多的內存。)



應用程序通常在部署之前進行編譯,因為網站使用app_code目錄。 當應用程序代碼文件夾中的任何內容髮生變化時,服務器將重新編譯代碼。 這意味著您可以隨時在網站上添加/更改代碼。

一個應用程序的優點是沒有重新編譯,所以初始啟動時間會更快。




我建議你在ASP.NET網站上觀看視頻Web應用程序項目和Web部署項目 ,這個項目很詳細地解釋了這個差異,這對我來說是非常有幫助的。

順便說一句,不要被標題弄糊塗,視頻的很大一部分解釋了網站項目和Web應用程序項目之間的區別,以及為什麼Microsoft在Visual Studio 2005中重新引入了Web應用程序項目(正如您可能已經知道的那樣最初只附帶網站項目,然後在SP1中添加Web應用程序項目)。 一個偉大的視頻,我強烈建議誰想知道的區別。




一個“網站”的代碼在一個特殊的App_Code目錄下,並且在運行時被編譯成幾個DLL(程序集)。 一個“Web應用程序”被預編譯成一個單獨的DLL。




Website和Project >>網站是使用Visual Studio創建ASP.NET應用程序的兩種不同的方法。 一個是無項目,另一個是項目環境。 差異是一樣的

  1. 解決方案文件與項目環境中的根目錄存儲在同一目錄中。
  2. 在項目環境中部署之前,需要刪除解決方案和項目文件。
  3. 完整的根目錄在無項目環境中部署。

使用這兩種方法沒有太大的區別。 但是,如果您正在創建需要較長時間的網站,請選擇項目環境。




Web應用程序項目模型

  • 提供與Visual Studio .NET Web項目相同的Web項目語義。 有一個項目文件(基於項目文件的結構)。 構建模型 - 項目中的所有代碼都被編譯成一個程序集。 支持IIS和內置的ASP.NET開發服務器。 支持Visual Studio 2005(重構,泛型等)和ASP.NET(主頁,成員和登錄,網站導航,主題等)的所有功能。 使用FrontPage服務器擴展(FPSE)不再是一個要求。

網站項目模型

  • 沒有項目文件(基於文件系統)。
  • 新的編譯模式。
  • 動態編譯和在頁面上工作,而無需在每個頁面視圖上構建整個站點。
  • 支持IIS和內置的ASP.NET開發服務器。
  • 每個頁面都有自己的程序集。
  • 不同的代碼模型。



這總是取決於你的客戶的要求。 ASP.NET只包含用戶需要的安全性和維護應用程序的靈活功能。

您可以將Web應用程序視為在ASP.NET框架中運行的二進製文件。 而網站作為一個靜態網頁,您可以查看並輕鬆部署源代碼。

但是,這兩種ASP.NET技術的優點和缺點是很好的。




在Web應用程序項目中,Visual Studio需要額外的頁面和用戶控件的.designer文件。 網站項目不需要這種開銷。 標記本身被解釋為設計。




網站:它自動生成app_code文件夾,如果你在服務器上發布它,之後如果你做任何特定的文件或頁面的一些變化,你不必編譯所有的文件。

Web應用程序它自動生成網站不生成的解決方案文件,如果在一個文件中進行更改,則必須編譯完整的項目以反映其更改。




Web應用程序需要更多的內存,大概是因為你別無選擇,只能編譯成一個程序集。 我只是將一個大的遺留網站轉換為一個Web應用程序,並且在編譯時使用

Unexpected error writing metadata to file '' -- 
Not enough storage is available to complete this operation. 

錯誤,並在運行時出現此錯誤:

Exception information: 
    Exception type: HttpException 
    Exception message: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()

我建議在內存受限的傳統硬件上轉換較大的網站是讓自己選擇恢復到網站模式。 即使在最初的成功之後,問題可能會在稍後蔓延。




在Web應用程序中,您可以創建項目功能的各個層次,並可以通過將它們分成許多項目來創建它們之間的相互依賴關係,但是您絕對不能在網站上執行此操作。




絕對的Web應用程序,單個DLL文件,易於維護。 但是一個網站更加靈活; 你可以在旅途中編輯aspx文件。




這裡的Web Supportive Application就是一個網站的例子。 網站和Web應用程序都可以動態/靜態取決於需求,這裡是了解網站和Web應用程序工作的一個例子。




網站 - 沒有解決方案文件將被創建。 如果我們要創建網站,不需要Visual Studio。

Web應用程序 - 將創建一個解決方案文件。 如果我們要創建Web應用程序,應該需要Visual Studio。 它會在bin文件夾中創建一個.dll文件。