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