ASP.NET网站还是ASP.NET Web应用程序?


848

在Visual Studio中启动新的ASP.NET项目时,可以创建ASP.NET Web应用程序,也可以创建ASP.NET网站。

ASP.NET Web应用程序和ASP.NET网站之间有什么区别?我为什么要选择一个?

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


6
在MSDN上可以找到完整和更近期(针对4.5)的比较和解释:Visual Studio中的Web应用程序项目与Web站点项目
Gustav

Answers:


556

网站:

网站项目被编译的飞行。您最终将获得更多的DLL文件,这可能很痛苦。当您在一个目录中有页面或控件需要引用另一目录中的页面和控件时,这也会带来问题,因为该另一目录可能尚未编译到代码中。另一个问题可能在发布中。

如果不要求Visual Studio不断重复使用相同的名称,它将为页面始终生成的DLL文件提供新的名称。这可能导致包含相同类名的DLL文件的多个紧密副本,这将产生大量错误。该Web站点项目是随Visual Studio 2005一起引入的,但事实证明它并不受欢迎。

Web应用程序:

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

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

参考

ASP.NET 2.0-网站与Web应用程序”项目一文也提供了为什么使用一个而不使用另一个的原因。这是它的摘录:

  • 您需要将大型Visual Studio .NET 2003应用程序迁移到VS 2005吗?使用Web应用程序项目。
  • 您要在不创建项目文件的情况下作为Web项目打开和编辑任何目录吗?使用网站项目。
  • 您需要在编译期间添加构建前和构建后步骤吗? 使用Web应用程序项目。
  • 您需要使用多个Web项目来构建Web应用程序吗?使用Web应用程序项目。
  • 您要为每个页面生成一个程序集吗?使用网站项目。
  • 您希望动态编译和处理页面而不在每个页面视图上构建整个网站?使用网站项目。
  • 您更喜欢单页代码模型而不是代码隐藏模型?使用网站项目。

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


5
您仍然可以使用基于文件的网站将整个网站编译为dll。
dtc

31
我倾向于这样想。如果您正在编写一个恰好使用HTML作为UI的应用程序,请使用Web应用程序。如果您的网站在其某些页面上恰好需要一点Asp.net,请使用“网站项目”。
伊恩·林罗斯

35
实际上,Web应用程序项目正是原始的ASP.NET项目类型。它们与我们在Visual Studio 2003中拥有的项目“不一样”。它们不是作为外接程序创建的。Visual Studio 2005 SP1只是还原了Visual Studio 2005 RTM错误删除的内容。
约翰·桑德斯

1
您可以在WebDeployment项目中使用WebApplication输出。您不能在WebDeployment项目中使用WebSite输出。如果要创建Deployment项目,请坚持使用WebApplication。但是对于开发来说,WebSite更为方便。但是,转换并不总是没有问题,因此请立即从WebApplication开始。
Stefan Steiger,2010年

8
@xarzu:网站“项目”没有.csproj或.vbproj文件。它们并不是真正的项目-它们只是充满文件的文件夹。
约翰·桑德斯

171

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

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

App_Code与Bin

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

代码背后

本主题特定于.aspx和.ascx文件。在不使用代码隐藏文件的新应用程序框架(例如ASP.NET MVC和ASP.NET Web页)中,此主题的重要性与日俱增。

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

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

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

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

另外,在Web应用程序中,页面/控件中没有错误检测功能,因为编译器仅编译您的代码隐藏类,而不编译在运行时编译的标记代码(在MVC中,您可以使用MvcBuildViews选项修复该代码)。

视觉工作室

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

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

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

在MVC Web应用程序项目中,您具有用于常见任务的其他命令和对话框,例如“添加视图”,“转到视图”,“添加控制器”等。这些在MVC网站中不可用。

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

NuGet软件包还原在网站上不起作用,您必须手动安装在packages.config上列出的软件包软件包还原现在可与从NuGet 2.7开始的网站一起使用


43
由于程序员是编写应用程序的,因此将构建该应用程序。测试团队在测试系统上测试应用程序。然后,客户安装应用程序。最后想你想要的是有人进行实时更改!
伊恩·林格罗斯

12
对我来说,最好的选择是在网站上,如果愿意,您始终可以从预编译的基类继承。在许多语言/框架(例如PHP)中,人们习惯于部署源代码。这并不意味着这些不是“严重的”应用程序。
Max Toro

6
“实际上,您无需管理那些DLL,甚至不必知道它们的存在。这不是问题。” -在框架混乱之前,不要正确清理旧版本,并开始在整个站点中引发名称冲突的编译异常...您可以通过使用WebDeployment项目来添加标记的错误检测。我也不确定在最后一点上“使用IIS可以将IIS用作服务器的网站”,您也可以使用Web应用程序进行此操作-我有类似这样的项目,其中该项目是较大Web应用程序的一部分。
Zhaph-Ben Duguid

3
部署网站并不一定总是要使用实时服务器。在理想的情况下,开发迭代应该在实际环境的镜像上进行测试。由于Web Apps无法对运行在Development IIS服务器上的站点(即不使用本地VS实例运行)进行快速的代码更改,因此测试快速的小型解决方案非常麻烦。在无法在本地计算机上复制相同条件的系统中,这种情况一直存在。
NikoRoberts 2011年

4
“在开发过程中,这可能是一个真正的痛苦,因为您必须不断重建才能看到更改”。要记住,要成为一个痛苦的项目,必须是MASSIVE项目或一台非常古老的计算机这些天重建。
达伦(Darren)

75

网站 =当图形设计师创建网站且程序员仅编辑一个或两个页面时使用

Web应用程序 =在由程序员创建应用程序且图形设计者仅编辑一个或两个页面/图像时使用。

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

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

警告: 我很多年前写了这个答案,从那以后就没有使用过Asp.net。我希望事情现在进展了。


40

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

为什么?因为在尝试更改或了解您的项目时,网站项目将使您无所适从。Visual Studio中的静态类型查找功能(例如查找用法,重构)将永久占用任何大小合理的项目。有关更多信息,请参见Visual Studio中的堆栈溢出问题慢速“查找所有引用”

我真的不明白为什么他们将Web应用程序丢弃在Visual Studio 2005中,以减轻痛苦,浪费精力,生产力降低网站项目类型。


30

MSDN中有一篇文章描述了这些区别:

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

顺便说一句:关于该主题也有一些类似的问题,例如:


我猜我应该在标记中使用codefile或
codebehind

因此,对于那些想知道的人:Web应用程序=结构良好的解决方案=标记中的代码隐藏VS网站=一堆文件=标记中的代码文件
frenchone

22

这听起来似乎有些明显,但是我认为这是一个被误解的原因,因为Visual Studio 2005最初只是随网站一起提供的。如果您的项目所处理的网站是相当有限的,并且没有太多的逻辑或物理隔离,则该网站很好。但是,如果它确实是具有许多模块的Web应用程序,其中许多用户可以在其中添加和更新数据,那么使用Web应用程序会更好。

网站模型的最大优点是本app_code节中的所有内容都是动态编译的。您无需完全重新部署即可进行C#文件更新。但是,这是一个巨大的牺牲。很多事情都是在难以控制的情况下发生的。命名空间很难控制,并且默认情况下,app_code由于所有内容都是动态编译的,因此在任何情况下,特定DLL的使用都无法使用。

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

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

可以在以下位置找到更详细的分析:


3
>该网站模型的最大优点是app_code部分中的所有内容都是动态编译的。这也有很大的缺点。我的网站托管有便宜但功能丰富的webhost4life。缺点是他们非常频繁地回收工作进程(15分钟?),这意味着在重新编译应用程序时,下一个用户的首页输出非常慢。
罗布·尼科尔森

19

从MCTS自定进度培训套件考试70-515本书中:

使用网络应用程序(项目),

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

#4是错误的。可以启用“编辑并继续”,但有一些限制。也许在2011年是正确的。#9应该说“您不能在不重新编译的情况下编辑单个源代码文件”。您可以编辑.aspx,.js,.css等,而无需重新编译。
约翰·桑德斯

#4有另一个角度。如果使用“文件”>“打开”>“网站”打开网站并导航到该网站的文件系统文件夹,而不是通过从开始窗口中选择解决方案来打开网站,则可以编辑类模块和代码隐藏(至少在vb.net中) ),而无需停止调试。在重新构建之前,您不会看到更改,但是,在修改代码时观察页面行为通常很有用。不利的一面是您丢失了解决方案的所有内容:断点,打开的文件,书签等。有时您必须删除sln / sou文件。
Wayfarer 2015年

16

这取决于您所开发的内容。

面向内容的网站将经常更改其内容,而网站则更适合。

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


16

Compilation 首先,编译存在差异。网站未在服务器上预编译,而是在文件上编译。这可能是一个优点,因为当您要更改网站中的某些内容时,您可以只从服务器下载特定文件,然后对其进行更改并将其上传回服务器,这样一切都会正常进行。在Web应用程序中,您无法执行此操作,因为所有内容都已预先编译,并且最终只有一个dll。当您在项目的一个文件中更改某些内容时,必须再次重新编译所有内容。因此,如果您想更改服务器网站上的某些文件,则是更好的解决方案。它还允许许多开发人员在一个网站上工作。另一方面,如果您不希望代码在服务器上可用,则应选择“ Web应用程序”。

Project structure 项目的结构也有所不同。在Web应用程序中,您有一个项目文件,就像在普通应用程序中一样。在Web站点中,没有传统的项目文件,您只有解决方案文件。所有参考和设置都存储在web.config文件中。 @Page directive @Page指令中包含与该页面关联的类的文件具有不同的属性。在Web应用程序中,它是标准的“ CodeBehind”,在网站中,您可以使用“ CodeFile”。您可以在以下示例中看到这一点:

Web应用程序:

<%@ 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开发网站应用程序,则此功能在Web Site.ASP.NET MVC中不起作用

ASP.NET MVC(模型视图控制器)的最佳和默认选项是Web应用程序。尽管可以在网站中使用MVC,但不建议这样做。

摘要-ASP.NET Web应用程序和网站之间最重要的区别是编译。因此,如果您在一个较大的项目上工作,可以由几个人进行修改,则最好使用网站。但是,如果您正在做一个较小的项目,则也可以使用Web应用程序。


在一个由多个人进行更改的大型项目中,您使用源代码管理,因此这不是使用网站“项目”的理由。
约翰·桑德斯

+1用于区分页面指令中的代码隐藏(webapp)与代码文件(网站)。这是所选答案中缺少的精度。
frenchone

11

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

  1. 在一个保护伞下拥有多个项目并在它们之间建立项目依赖关系。例如,对于PCS,我们可以在网络应用程序中包含以下内容:

    • 门户网站
    • 通知控制器(用于发送电子邮件)
    • 业务层
    • 资料存取层
    • 例外经理
    • 服务器实用程序
    • WCF服务(所有平台通用)
    • 项目清单
  2. 在与ASP.NET页关联的类文件中的代码上运行单元测试

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

11

主要区别之一是网站可以动态编译并创建即时程序集。Web应用程序可编译为一个大型程序集。

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


4
“在vs2008中已经消除了两者之间的区别”-不确定您的意思-它们在VS2008中仍然是不同的项目类型,行为不同且通过不同的菜单选项创建-但是至少它们在默认情况下都可用在VS2008中。
Zhaph-Ben Duguid

9

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

应用程序的优点是无需重新编译,因此初始启动时间将更快。


这是部分正确,你可以在网站页面预编译,如果你想
阿姆鲁H.阿卜杜勒Elmajeed

8

我建议您在ASP.NET网站上观看视频Web应用程序项目和Web部署项目,该视频详细解释了两者之间的差异,这对我很有帮助。

顺便说一下,不要被标题弄糊涂,视频的很大一部分解释了网站项目和Web应用程序项目之间的区别,以及Microsoft为什么在Visual Studio 2005中重新引入了Web应用程序项目(您可能已经知道,最初仅与网站项目一起提供,然后在SP1中添加了Web应用程序项目)。对于任何想知道两者之间的区别的人,我强烈推荐一个很棒的视频。



7

“网站”的代码位于特殊的App_Code目录中,并且在运行时被编译为多个DLL(程序集)。“ Web应用程序”被预编译为一个DLL。


5

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

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

使用这两种方法都没有太大的基本区别。但是,如果要创建将花费较长时间的网站,请选择项目环境。


1
解决方案文件不必位于同一文件夹中。同样,标准的发布机制会删除目标站点中不应存在的任何工件,例如,未部署代码隐藏文件。
约翰·桑德斯

5

Web应用程序项目模型

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

网站项目模型

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

5

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

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

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


4

网站-将不会创建解决方案文件。如果我们要创建网站,则无需Visual Studio。

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


2
-1如果通过Visual Studio创建网站项目,则实际上确实具有解决方案文件。您没有项目文件。
达伦(Darren)

+1当然,您可以创建一个解决方案文件,但该文件几乎为空,因此很
烦人

3

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


3

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

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


“编译整个项目”并不意味着编译项目中的每个文件。未更改的源代码文件将不会重新编译。
约翰·桑德斯

3

在Web应用程序中,您可以创建项目功能的各个层,并且可以通过将其划分为多个项目来在它们之间创建相互依赖关系,但是您永远不能在网站上做到这一点。


3

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


您也可以在Web应用程序项目中编辑aspx文件。
约翰·桑德斯

3

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

我建议在受内存限制的旧硬件上转换较大的站点,是选择该选项以还原为网站模型。即使在最初取得成功之后,问题也可能在稍后蔓延。


那似乎不是编译时的例外。
约翰·桑德斯

1

Web支持应用程序是网站的一个示例。

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


这不适用于asp.net。网站/ Web应用程序的区别(用asp.net术语)更多地是关于文件的组织方式(组织良好的解决方案或一堆文件)和编译方式(“ JIT”与静态)。在这两种情况下,“程序”主要是服务器端。
frenchone

0

总结上面的一些答案:

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

网站:可能。优点:短期利益。缺点:项目混乱的长期风险。

Web App:缺点:不可能。编辑页面,将更改归档到源代码管理,然后构建和部署整个站点。优点:保持高质量的项目。

发展问题

网站:没有.csproj文件的简单项目结构。两个.aspx页可能具有相同的类名,而不会发生冲突。随机的项目目录名称会导致生成错误,例如.net framework为什么与自己生成的文件冲突以及.net Framework为什么与其自己生成的文件冲突。优点:简单(简单)。缺点:不稳定。

Web App:项目结构类似于WebForms项目,带有.csproj文件。ASP页面的类名称必须唯一。优点:简单(智能)。缺点:没有,因为网络应用仍然很简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.