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


Answers

網站是您部署到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

Question

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

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

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




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文件。




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

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

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




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

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




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

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




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

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




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

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

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

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

更詳細的分析可以在:




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




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




Web應用程序項目模型

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

網站項目模型

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



Links