ASP.NET网站或ASP.NET Web应用程序?

当我在Visual Studio中启动一个新的ASP.NET项目时,我可以创build一个ASP.NET Web应用程序,或者我可以创build一个ASP.NET Web站点。

ASP.NET Web应用程序和ASP.NET网站有什么区别? 为什么我会select其中一个呢?

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

网站:

网站项目是即时编译的。 你最终得到更多的DLL文件,这可能是一个痛苦。 当一个目录中的页面或控件需要引用另一个目录中的页面和控件时,也会出现问题,因为另一个目录可能尚未编译成代码。 另一个问题可以在出版。

如果不告诉Visual Studio不断重复使用相同的名称,它会为由页面生成的DLL文件始终提供新的名称。 这可能会导致几个包含相同的类名的DLL文件的密切副本,这将产生大量的错误。 网站项目是在Visual Studio 2005中引入的,但结果并不是非常stream行。

Web应用程序:

Web应用程序项目是作为外接程序创build的,现在作为Visual Studio 2005 SP 1的一部分存在。主要区别在于Web应用程序项目的devise工作与Visual Studio 2003附带的Web项目相似。它将在构build时将应用程序编译成单个DLL文件。 为了更新项目,必须重新编译并发布DLL文件以进行更改。

Web应用程序项目的另一个不错的function是从项目视图中排除文件更加容易。 在“网站”项目中,排除的每个文件都使用文件名中的排除关键字进行重命名。 在Web应用程序项目中,项目只是跟踪哪些文件包含/从项目视图中排除,而无需重命名,使事情更加整洁。

参考

文章ASP.NET 2.0 – 网站vs Web应用程序项目也给出了为什么要使用一个而不是其他的原因。 这是它的摘录:

  • 您需要将大型Visual Studio .NET 2003应用程序迁移到VS 2005? 使用Web应用程序项目。
  • 你想打开和编辑任何目录作为一个Web项目,而无需创build一个项目文件? 使用网站项目。
  • 您需要在编译期间添加预构build和后构build步骤? 使用Web应用程序项目。
  • 您需要使用多个Web项目来构buildWeb应用程序? 使用Web应用程序项目。
  • 你想为每个页面生成一个程序集? 使用网站项目。
  • 你更喜欢dynamic编译和在页面上工作,而不是在每个页面视图上构build整个站点? 使用网站项目。
  • 你更喜欢单页面的代码模型到代码隐藏模型? 使用网站项目。

Web应用程序项目与网站项目 (MSDN)解释了网站和Web应用程序项目之间的差异。 另外,它讨论了在Visual Studio中进行的configuration。

网站是您部署到ASP.NET Web服务器(如IIS)的内容。 只是一堆文件和文件夹。 网站中没有任何内容将您与Visual Studio联系在一起(没有任何项目文件)。 代码生成和网页编译(如.aspx,.ascx,.master)是在运行时dynamic完成的,对这些文件的更改由框架检测并自动重新编译。 你可以把你想要在两个页面之间共享的代码放到特殊的App_Code文件夹中,或者你可以预编译它并把程序集放到Bin文件夹中。

Web应用程序是一个特殊的Visual Studio项目。 与Web站点的主要区别在于,当您构build项目时,所有的代码文件都被编译到一个单独的程序集中,该程序集位于bin目录中。 您不要将代码文件部署到Web服务器。 您可以将它们放在任何位置,而不必像共享代码文件那样使用特殊文件夹。 由于Web应用程序包含不想部署的文件(如项目和代码文件),因此Visual Studio中有一个“ 发布”命令,用于将Web站点输出到指定的位置。

App_Code vs Bin

部署共享代码文件通常是一个坏主意,但这并不意味着您必须selectWeb应用程序。 您可以有一个网站,引用一个类库项目,其中包含网站的所有代码。 Web应用程序只是一个方便的方法。

代码隐藏

本主题特定于.aspx和.ascx文件。 本主题在新的应用程序框架(如不使用代码隐藏文件的ASP.NET MVC和ASP.NET Web页面)中逐渐减less。

通过将所有代码文件编译为单个程序集,包括.aspx页面和.ascx控件的代码隐藏文件,在Web应用程序中,您必须重新构build每个小改动,而且不能进行实时更改。 在开发过程中,这可能是一个真正的痛苦,因为您必须不断重新构build以查看更改,而Web站点更改由运行时检测到,并且页面/控件将自动重新编译。

使用运行时pipe理代码隐藏程序集对于您来说工作较less,因为您不必担心为页面/控件赋予唯一的名称,或将它们组织到不同的名称空间中。

我并不是说部署代码文件总是一个好主意(特别是不是在共享代码文件的情况下),但代码隐藏文件应该只包含执行特定于UI的任务,线程事件处理程序等的代码。您的应用程序应该是分层,以便重要的代码总是在Bin文件夹中。 如果是这种情况,那么部署代码隐藏文件不应该被认为是有害的。

Web应用程序的另一个限制是您只能使用该项目的语言。 在Web站点中,您可以在C#中使用一些页面,在VB中使用一些页面等。不需要特殊的Visual Studio支持。 这是构build提供程序可扩展性的优点。

此外,在Web应用程序中,由于编译器仅编译代码隐藏类,而不是编译代码(在MVC中,您可以使用MvcBuildViews选项修复此问题),因此在运行时编译时不会在页面/控件中检测到错误。

视觉工作室

由于Web应用程序是Visual Studio项目,因此您将获得Web站点中不可用的一些function。 例如,您可以使用构build事件来执行各种任务,例如缩小和/或组合JavaScript文件。

在Visual Studio 2010中引入的另一个不错的function是Web.config转换 。 这在网站中也是不可用的。 现在在VS 2013中使用网站。

构buildWeb应用程序比构buildWeb站点要快,特别适用于大型站点。 这主要是因为Web应用程序不编译标记代码。 在MVC中,如果您将MvcBuildViews设置为true,那么它将编译标记代码,并获得错误检测,这非常有用。 不利的一面是,每当您构build解决scheme时,都会构build完整的网站,这可能会很慢且效率低下,特别是在您未编辑网站时。 我发现自己打开和closuresMvcBuildViews(这需要一个项目卸载)。 另一方面,通过网站,您可以select是否将网站构build为解决scheme的一部分。 如果您select不这样做,那么构build解决scheme的速度非常快,您可以随时单击“网站”节点,然后select“构build”(如果已经进行了更改)。

在一个MVC Web应用程序项目中,您可以为常见任务添加额外的命令和对话框,如“添加视图”,“转到视图”,“添加控制器”等。这些在MVC网站中不可用。

如果使用IIS Express作为开发服务器,则可以在Web站点中添加虚拟目录。 该选项在Web应用程序中不可用。

NuGet软件包还原在网站上不起作用,您必须手动安装packages.config中列出的软件包 Package Restore现在可以在网站上启动NuGet 2.7

网站 =由平面devise师创build网站时使用,程序员只编辑一两页

Web应用程序 =在程序员创build应用程序时使用,graphicsdevise师只编辑一个或两个分页/图像。

网站可以使用任何HTML工具,而无需开发者工作室,因为项目文件不需要更新等。当团队主要使用开发者工作室并且存在高代码内容时,Web应用程序是最好的。

(在编译时在Web应用程序中发现了一些编码错误,直到运行时才在网站中find)。

警告: 我多年前写了这个答案,并没有使用Asp.net。 我预料现在事情已经转移。

除非您特别需要dynamic编译的项目, 否则请勿使用网站项目

为什么? 因为网站项目会在您尝试更改或理解您的项目时将您推上墙。 Visual Studio中的静态types查找function(例如,查找用法,重构)将永远在任何合理大小的项目上运行。 有关更多信息,请参阅Visual Studio中的“查找所有引用”缓慢的堆栈溢出问题。

我真的不明白为什么他们放弃了Visual Studio 2005中的Web应用程序,因为这个网站的工作types是令人痛苦的,完整的,生产力高的网站项目types。

MSDN中有一篇文章描述了这些差异:

比较网站项目和Web应用程序项目

顺便说一句:有关于这个话题的一些类似的问题,例如:

  • 网站与ASP.Net Web应用程序在Visual Studio中 注意:已经被删除,不再是在SO上
  • 网站或web应用in.ASP.NET

这可能听起来有点明显,但我认为这是误解,因为Visual Studio 2005最初只与网站一起提供。 如果您的项目处理的网站相当有限,并没有太多的逻辑或物理分离,网站是好的。 但是,如果它真的是一个具有不同模块的Web应用程序,许多用户添加和更新数据,那么最好使用Web应用程序。

网站模型最大的app_codeapp_code部分中的任何内容都是dynamic编译的。 您可以在不进行完全重新部署的情况下进行C#文件更新。 然而,这是一个很大的牺牲。 很多事情发生在难以控制的封面之下。 由于一切都是dynamic编译的,名称空间很难控制,并且默认情况下,特定的DLL使用情况会在app_code任何地方出现。

Web应用程序模型没有dynamic编译,但您可以控制我提到的事情。

如果您正在进行多层开发,我强烈build议使用Web应用程序模型。 如果您正在进行有限的网站或快速而肮脏的实施,则网站模型可能具有优势。

更详细的分析可以在:

  • Web应用程序项目和Web部署项目在这里
  • 网站或Web应用程序?

从MCTS自学培训套装考试70-515书:

随着Web应用程序(项目),

  1. 你可以创build一个MVC应用程序。
  2. Visual Studio将文件列表存储在项目文件(.csproj或.vbproj)中,而不是依赖文件夹结构。
  3. 您不能混合使用Visual Basic和C#。
  4. 如果不停止debugging会话,则无法编辑代码。
  5. 您可以在多个Web项目之间build立依赖关系。
  6. 您必须在部署之前编译应用程序,这样可以防止在另一个页面无法编译时testing页面。
  7. 您不必将源代码存储在服务器上。
  8. 您可以控制程序集名称和版本。
  9. 部署后无法编辑单个文件而无需重新编译。

这取决于你正在开发的东西。

内容导向型网站的内容会经常变化,而网站则会更好。

应用程序倾向于将其数据存储在数据库中,而其页面和代码很less会发生更改。 在这种情况下,最好有一个Web应用程序,在这个应用程序中,组件的部署更受控制,并且对unit testing有更好的支持。

Compilation首先Compilation有所不同。 Web站点不在服务器上预编译,而是在文件上编译。 这可能是一个优势,因为当你想改变你的网站的东西,你可以从服务器下载一个特定的文件,改变它,并上传这个文件回服务器,一切都会正常工作。 在Web应用程序中,你不能这样做,因为everthing是预编译的,你最终只有一个DLL。 当你在项目的一个文件中改变某些东西时,你必须重新编译一切。 所以,如果你想有可能改变服务器上的一些文件网站是更好的解决scheme。 它还允许许多开发人员在一个网站上工作。 另一方面,如果您不希望代码在服务器上可用,则应该selectWeb应用程序。 这个选项对unit testing来说也更好,因为在发布你的网站之后创build了一个DLL文件。

Project structure也有所不同。 在Web应用程序中,您有一个项目文件,就像您在正常的应用程序中一样。 在网站上没有传统的项目文件,只有解决scheme文件。 所有的参考和设置都存储在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" %> 

命名空间 – 在上面的例子中,你可以看到另一个区别 – 如何创build命名空间。 在Web应用程序中,命名空间只是项目的名称。 在网站中有dynamic编译页面的默认命名空间ASP。

编辑并继续 – 在Web应用程序编辑并继续选项是可用的(要打开它,你必须去工具菜单,单击选项,然后find编辑并继续debugging)。 此function不能在Web Site.ASP.NET MVCIf中使用,您要开发Web应用程序

ASP.NET MVC(模型视图控制器)最好的和默认的select是Web应用程序。 尽pipe可以在网站中使用MVC,但并不推荐。

总结 – ASP.NET Web应用程序和网站之间最重要的区别是编译。 所以如果你在一个更大的项目上工作,那里有几个人可以修改它,最好使用网站。 但是如果你正在做一个更小的项目,你也可以使用Web应用程序。

其中一个主要区别是网站dynamic编译并创build即时组件。 networking应用程序编译成一个大的程序集。

两者之间的区别已经在Visual Studio 2008中取消了。

是的,Web应用程序比Web站点好得多,因为Web应用程序给了我们自由:

  1. 将多个项目集中在一起,并build立项目之间的依赖关系。 例如,对于PCS,我们可以在Web应用程序

    • 门户网站
    • 通知控制器(用于发送电子邮件)
    • 业务层
    • 数据访问层
    • exceptionpipe理器
    • 服务器工具
    • WCF服务(适用于所有平台)
    • 列表项目
  2. 对与ASP.NET页面关联的类文件中的代码运行unit testing

  3. 引用那些与独立类的页面和用户控件相关的类
  4. 为整个站点创build一个程序集
  5. 控制为该站点生成的程序集名称和版本号
  6. 避免将源代码放在生产服务器上。 (您可以避免将源代码部署到IIS服务器,在某些情况下,如共享主机环境,您可能会担心未经授权访问IIS服务器上的源代码(对于网站项目,您可以通过以下方式避免此风险在开发计算机上进行预编译,然后部署生成的程序集,而不是源代码。但是,在这种情况下,您将失去轻松进行网站更新的一些好处。
  7. 与网站的性能问题(对网站的第一个请求可能需要编译网站,这可能会导致延迟。如果网站运行在内存不足的IIS服务器上,包括整个网站单个程序集可能会使用比多个程序集所需更多的内存。)

应用程序通常在部署之前进行编译,因为网站使用app_code目录。 当应用程序代码文件夹中的任何内容发生变化时,服务器将重新编译代码。 这意味着您可以随时在网站上添加/更改代码。

一个应用程序的优点是没有重新编译,所以初始启动时间会更快。

我build议你在ASP.NET网站上观看videoWeb应用程序项目和Web部署项目 ,这个项目很详细地解释了这个差异,这对我来说是非常有帮助的。

顺便说一句,不要被标题弄糊涂,video的很大一部分解释了网站项目和Web应用程序项目之间的区别,以及为什么Microsoft在Visual Studio 2005中重新引入了Web应用程序项目(正如您可能已经知道的那样最初只附带网站项目,然后在SP1中添加Web应用程序项目)。 一个伟大的video,我强烈build议谁想知道的区别。

一个“网站”的代码在一个特殊的App_Code目录下,并且在运行时被编译成几个DLL(程序集)。 一个“Web应用程序”被预编译成一个单独的DLL。

Website和Project >>网站是使用Visual Studio创buildASP.NET应用程序的两种不同的方法。 一个是无项目,另一个是项目环境。 差异是一样的

  1. 解决scheme文件与项目环境中的根目录存储在同一目录中。
  2. 在项目环境中部署之前,需要删除解决scheme和项目文件。
  3. 完整的根目录在无项目环境中部署。

使用这两种方法没有太大的区别。 但是,如果您正在创build需要较长时间的网站,请select项目环境。

Web应用程序项目模型

  • 提供与Visual Studio .NET Web项目相同的Web项目语义。 有一个项目文件(基于项目文件的结构)。 构build模型 – 项目中的所有代码都被编译成一个程序集。 支持IIS和内置的ASP.NET开发服务器。 支持Visual Studio 2005(重构,generics等)和ASP.NET(主页,成员和login,网站导航,主题等)的所有function。 使用FrontPage服务器扩展(FPSE)不再是一个要求。

网站项目模型

  • 没有项目文件(基于文件系统)。
  • 新的编译模式。
  • dynamic编译和在页面上工作,而无需在每个页面视图上构build整个站点。
  • 支持IIS和内置的ASP.NET开发服务器。
  • 每个页面都有自己的程序集。
  • 不同的代码模型。

这总是取决于你的客户的要求。 ASP.NET只包含用户需要的安全性和维护应用程序的灵活function。

您可以将Web应用程序视为在ASP.NET框架中运行的二进制文件。 而网站作为一个静态网页,您可以查看并轻松部署源代码。

但是,这两种ASP.NET技术的优点和缺点是很好的。

在Web应用程序项目中,Visual Studio需要额外的页面和用户控件的.designer文件。 网站项目不需要这种开销。 标记本身被解释为devise。

网站:它自动生成app_code文件夹,如果你在服务器上发布它,之后如果你做任何特定的文件或页面的一些变化,你不必编译所有的文件。

Web应用程序它自动生成网站不生成的解决scheme文件,如果在一个文件中进行更改,则必须编译完整的项目以反映其更改。

Web应用程序需要更多的内存,大概是因为你别无select,只能编译成一个程序集。 我只是将一个大型的遗留网站转换成一个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() 

我build议在内存受限的传统硬件上转换较大的网站是让自己select恢复到网站模式。 即使在最初的成功之后,问题可能会在稍后蔓延。

在Web应用程序中,您可以创build项目function的各个层次,并可以通过将它们分成许多项目来创build它们之间的相互依赖关系,但是您绝对不能在网站上执行此操作。

绝对的Web应用程序,单个DLL文件,易于维护。 但是一个网站更加灵活; 你可以在旅途中编辑aspx文件。

这里的Web Supportive Application就是一个网站的例子。

这里的Web Supportive Application就是一个网站的例子。 网站和Web应用程序都可以dynamic/静态取决于需求,这里是了解网站和Web应用程序工作的一个例子。

网站 – 没有解决scheme文件将被创build。 如果我们要创build网站,不需要Visual Studio。

Web应用程序 – 将创build一个解决scheme文件。 如果我们要创buildWeb应用程序,应该需要Visual Studio。 它会在bin文件夹中创build一个.dll文件。