提问



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


ASP.NET Web应用程序和ASP.NET Web站点之间有什么区别?为什么我会选择一个而不是其他?


根据我使用的Visual Studio版本,答案是否有所不同?

最佳参考


网站:


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


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


网络应用


Web应用程序项目是作为加载项创建的,现在作为一部分存在
SP 1 for Visual  Studio  2005。主要区别是Web应用程序项目
旨在与Visual  Studio  2003附带的Web项目类似。它将在构建时将应用程序编译为单个DLL文件
时间。为了更新项目,必须重新编译它和DLL文件
发布以进行更改。


Web应用程序的另一个不错的功能
项目从项目视图中排除文件要容易得多
网站项目,您排除的每个文件都使用排除项重命名
文件名中的关键字。在Web应用程序项目中,项目就是
在没有项目视图的情况下跟踪要包含/排除的文件
重命名它们,使事情变得更加整洁。


参考 [11]


文章 ASP.NET 2.0 - 网站与Web应用程序项目也说明了为什么要使用一个而不是另一个的原因。以下是它的摘录:[12]



  

      
  • 您需要将大型Visual Studio .NET 2003应用程序迁移到VS.
      2005年? 使用Web应用程序项目。

  •   
  • 您想要在没有的情况下打开和编辑任何目录作为Web项目
      创建项目文件? 使用网站
      项目

  •   
  • 您需要在编译期间添加预构建和后构建步骤吗?
      使用Web应用程序项目。

  •   
  • 您需要使用多个Web构建Web应用程序
      项目? 使用Web应用程序项目。

  •   
  • 您想为每个页面生成一个程序集吗? 使用网站项目。

  •   
  • 您更喜欢动态编辑并在没有构建的情况下处理页面
      每个页面视图上的整个网站? 使用网络
      网站项目。

  •   
  • 您更喜欢单页代码模型到代码隐藏模型吗? 使用网站
      项目

  •   



Web应用程序项目与网站项目(MSDN)解释了Web站点和Web应用程序项目之间的差异。此外,它还讨论了在Visual Studio中进行的配置。[13]

其它参考1


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


Web应用程序是一个特殊的Visual Studio项目。 与Web站点的主要区别在于,在构建项目时,所有代码文件都编译为单个程序集,该程序集位于bin目录中。您不需要将代码文件部署到Web服务器。您可以将它们放在任何位置,而不是在共享代码文件中使用特殊文件夹,就像在类库中一样。由于Web应用程序包含不打算部署的文件(例如项目和代码文件),因此Visual Studio中有一个发布命令可将网站输出到指定位置。[16]


App_Code vs Bin



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


代码隐藏



本主题特定于.aspx和.ascx文件。在不使用代码隐藏文件的ASP.NET MVC和ASP.NET Web页面等新应用程序框架中,此主题越来越不相关。


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


让运行时管理代码隐藏程序集对您来说工作较少,因为您不必担心提供页面/控件的唯一名称,或将它们组织到不同的名称空间中。


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


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


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


Visual Studio



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


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


构建Web应用程序比构建Web站点更快,特别是对于大型站点。这主要是因为Web应用程序不编译标记代码。在MVC中,如果将MvcBuildViews设置为true,那么它会编译标记代码并获得错误检测,这非常有用。不好的一面是,每次构建解决方案时,它都会构建完整的站点,这可能会很慢且效率低下,特别是如果您不编辑站点。我发现自己打开和关闭MvcBuildViews(这需要一个项目卸载)。另一方面,使用网站,您可以选择是否要将网站构建为解决方案的一部分。如果您选择不这样做,那么构建解决方案的速度非常快,如果您进行了更改,则可以始终单击网站节点并选择生成。


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


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


NuGet包还原在网站上不起作用,您必须手动安装在packages.config上列出的包包恢复现在适用于从NuGet 2.7开始的网站[19]

其它参考2


网站 =在图形设计人员创建网站时使用,程序员只编辑一页或两页


Web应用程序 =在程序员创建应用程序时使用,图形设计人员只编辑一个或两个分页/图像。


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


(编译时在Web应用程序中发现了一些编码错误,这些错误在运行时之前在网站中找不到。)


警告: 我多年前写过这个答案,之后就没有使用过Asp.net。我希望事情现在已经开始了。

其它参考3


除非您特别需要动态编译的项目,否则不要使用网站项目


为什么?因为在尝试更改或了解您的项目时,网站项目会引起您的反响。 Visual Studio中的静态类型查找功能(例如查找用法,重构)将永远占用任何合理大小的项目。有关详细信息,请参阅Visual Studio 中的Stack  Overflow问题 SlowFind All References。


我真的不明白为什么他们在Visual  Studio  2005中放弃了Web应用程序,用于引起疼痛,消耗精神,生产力的痈网站项目类型。

其它参考4


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


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


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



  • 网站与Visual Studio中的ASP.Net Web应用程序注意:已删除,不再在SO

  • 网站或webapplication in.ASP.NET


其它参考5


这可能听起来有点明显,但我认为这是一个被误解的东西,因为Visual  Studio  2005最初只与网站一起发布。如果你的项目处理的网站相当有限且没有很多逻辑或物理分离,网站很好。但是,如果它是真正的Web应用程序,其中包含许多用户添加和更新数据的不同模块,那么最好使用Web应用程序。


网站模型的最大专家是app_code部分中的任何内容都是动态编译的。您可以在没有完全重新部署的情况下进行C#文件更新。然而,这是一个巨大的牺牲。许多事情发生在难以控制的封面之下。名称空间很难控制,默认情况下,对于app_code下的任何内容,特定的DLL使用都会超出窗口,因为所有内容都是动态编译的。


Web应用程序模型没有动态编译,但您可以控制我提到的内容。


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


更详细的分析可以在:



  • Web应用程序项目和Web部署项目在此处

  • 网站或网络应用程序?


其它参考6


来自MCTS自学培训套件考试70-515书:[24] [25]



  使用Web应用程序(项目),

  
  

      
  1. 您可以创建MVC应用程序。

  2.   
  3. Visual Studio将文件列表存储在项目文件(.csproj或.vbproj)中,而不是依赖于文件夹结构。

  4.   
  5. 您不能将Visual Basic和C#混合使用。

  6.   
  7. 如果不停止调试会话,则无法编辑代码。

  8.   
  9. 您可以在多个Web项目之间建立依赖关系。

  10.   
  11. 您必须在部署之前编译应用程序,这会阻止您在其他页面无法编译时测试页面。

  12.   
  13. 您不必将源代码存储在服务器上。

  14.   
  15. 您可以控制程序集名称和版本。

  16.   
  17. 部署后无法重新编译,无法编辑单个文件。

  18.   


其它参考7



   Compilation 首先编译有所不同。 Web站点未在服务器上预编译,它是在文件上编译的。它可能是
  一个优点,因为当你想改变你的网络中的东西
  站点您可以从服务器下载特定文件,更改它
  将此文件上传回服务器,一切正常。在网上
  应用程序你不能这样做因为everthing是预编译的
  你最终只有一个dll。当你在一个文件中更改某些内容时
  你的项目你必须重新编译一切。如果你愿意的话
  喜欢有可能在服务器网站上更改一些文件
  更好的解决方案。它还允许许多开发人员在一个上工作
  网站。另一方面,如果你不想要你的代码
  在服务器上可用,您应该选择Web应用程序。这个
  选项也适用于单元测试,因为有一个DLL文件
  在发布您的网站后创建。



Project structure
 项目结构也存在差异。在Web应用程序中,您有一个项目文件,就像在普通应用程序中一样。在网站上没有传统的项目文件,你只有解决方案文件。所有引用和设置都存储在web.config文件中。
@Page directive
 @Page指令中有一个不同的属性,用于包含与此页面关联的类的文件。在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 Application中,命名空间只是一个
  项目名称。在网站中有默认的命名空间ASP
  动态编译的页面。

  
  编辑并继续 - 在Web应用程序编辑并继续选项中
  可用(要打开它,您必须转到工具菜单,然后单击选项
  然后在调试中找到编辑并继续)。此功能无效
  在Web Site.ASP.NET MVCIf中您要使用开发Web应用程序

  
  ASP.NET MVC(模型视图控制器)最好的默认选项是
  Web应用程序。虽然可以在网站上使用MVC
  不建议。

  
  总结 - ASP.NET Web应用程序之间最重要的区别
  和网站是汇编。所以,如果你在一个更大的项目工作
  一些人可以修改它,最好使用网站。但如果你这样做
  做一个较小的项目,你也可以使用Web应用程序。


其它参考8


这取决于你正在开发什么。


面向内容的网站的内容会经常变化,网站会更好。


应用程序往往将其数据存储在数据库中,其页面和代码很少发生变化。在这种情况下,最好有一个Web应用程序,其中组件的部署受到更多控制,并且对单元测试有更好的支持。

其它参考9


其中一个主要区别是网站动态编译并创建即时组件。 Web应用程序编译成一个大型程序集。


两者之间的区别已在Visual  Studio  2008中完成。

其它参考10


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



  1. 在一个保护伞下建立多个项目并建立项目
    之间的依赖关系。例如。对于PCS,我们可以在网络中关注
    应用-



    • 门户网站

    • 通知控制器(用于发送电子邮件)

    • 业务层

    • 数据访问层

    • 例外管理员

    • 服务器实用程序

    • WCF服务(适用于所有平台)

    • 列表项


  2. 对类文件中的代码运行单元测试
    与ASP.NET页面相关联

  3. 引用那些类
    与独立类的页面和用户控件相关联

  4. 为整个网站创建单个程序集

  5. 控制为网站生成的程序集名称和版本号

  6. 避免将源代码放在生产服务器上。 (你可以避免
    将源代码部署到IIS服务器。在某些情况下,例如
    共享托管环境,您可能会担心
    未经授权访问IIS服务器上的源代码。 (对于网络
    站点项目,你可以通过预编译来避免这种风险
    开发计算机并部署生成的程序集
    源代码。但是,在这种情况下,你会失去一些
    轻松站点更新的好处。)

  7. 网站的性能问题(The
    对网站的第一次请求可能需要编译网站,
    这会导致延迟。如果网站正在运行
    内存不足的IIS服务器,包括整个站点
    单个程序集可能会使用比需要更多的内存
    多个组件。)


其它参考11


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


应用程序的优势在于没有重新编译,因此初始启动时间会更快。

其它参考12


我建议您观看视频 Web应用程序项目& ASP.NET网站上的Web部署项目,它详细解释了这些差异,这对我很有帮助。[26]


顺便说一下,不要对标题感到困惑,视频的很大一部分解释了网站项目和Web应用程序项目之间的区别以及Microsoft为何在Visual Studio 2005中重新引入Web应用程序项目(正如您可能已经知道的那样)最初只附带网站项目,然后在SP1中添加了Web应用程序项目。我强烈推荐一个伟大的视频给任何想要了解其中的人。

其它参考13


网站将其代码放在一个特殊的App_Code目录中,并在运行时将其编译成几个DLL(程序集)。Web应用程序预编译到一个DLL中。

其它参考14


网站和项目>>网站是使用visual studio创建ASP.NET应用程序的两种不同方法。
一个是无项目的,另一个是项目环境。差异如下



  1. 解决方案文件与项目环境中的根目录存储在同一目录中。

  2. 在项目环境中部署之前,需要删除解决方案和项目文件。

  3. 在无项目环境中部署完整的根目录。



使用这两种方法没有太大的区别。但是,如果您要创建需要更长时间的网站,请选择项目环境。

其它参考15


Web应用程序项目模型



  • 提供与Visual Studio .NET Web相同的Web项目语义
    项目。有一个项目文件(基于项目文件的结构)。
    构建模型 - 项目中的所有代码都编译为单个代码
    部件。支持IIS和内置的ASP.NET开发
    服务器。支持Visual Studio 2005的所有功能(重构,
    泛型等)和ASP.NET(母版页,成员资格和登录,
    网站导航,主题等)。使用FrontPage Server Extensions
    (FPSE)不再是要求。



网站项目模型



  • 没有项目文件(基于文件系统)。

  • 新补偿关系模型。

  • 动态编辑和处理页面而不构建整个站点
    在每个页面视图上。

  • 支持IIS和内置的ASP.NET开发服务器。

  • 每个页面都有自己的装配。

  • 不同的代码模型。


其它参考16


它始终取决于您的客户的要求。 ASP.NET只包含用户安全性和易于维护应用程序所需的灵活功能。


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


但是这两种ASP.NET技术的优点和缺点都是有益的。

其它参考17


网站 - 不会创建任何解决方案文件。如果我们想创建不需要Visual Studio的网站。


Web应用程序 - 将创建解决方案文件。如果我们要创建Web应用程序,则需要Visual Studio。它将在bin文件夹中创建一个.dll文件。

其它参考18


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

其它参考19


WebSite:它自动生成app_code文件夹,如果您在服务器上发布它,之后如果您在任何特定文件或页面中进行某些更改,则不必编译所有文件。


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

其它参考20


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()


我建议在内存受限的旧硬件上转换大型网站是为了让您自己选择恢复到网站模型。即使在最初的成功之后,问题可能会在以后蔓延。

其它参考21


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

其它参考22


绝对是Web应用程序,单个DLL文件,易于维护。但是网站更灵活;你可以随时编辑aspx文件。

其它参考23


[27]


这里的Web支持应用程序是网站的一个例子。
网站和Web应用程序都可以是动态/静态的,它取决于要求,这里是一个了解网站和Web应用程序的工作的例子。

其它参考24


总结一下上面的一些答案:


灵活性,您可以对网页进行实时更改吗?


网站:可能。亲:短期利益。骗局:项目混乱的长期风险。


Web App :Con:不可能。编辑页面,将更改存档到源控件,然后构建和部署整个站点。亲:保持优质项目。


发展问题


网站:没有.csproj文件的简单项目结构。两个.aspx页面可能具有相同的类名而不会发生冲突。随机项目目录名称导致构建错误,例如.net框架与其自己生成的文件冲突的原因以及.net框架与其自己生成的文件冲突的原因。亲:简单(简单)。骗局:不稳定。


Web App :类似于WebForms项目的项目结构,带有.csproj文件。 asp页面的类名必须是唯一的。亲:简单(聪明)。 Con:none,因为Web应用程序仍然很简单。