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

ASP.NET Web应用程序和ASP.NET网站之间的区别是什么?为什么我会选择一个而不是另一个?

答案是否因我使用的Visual Studio版本而异?


当前回答

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

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

BTW:关于这个话题有一些类似的问题,例如:

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

其他回答

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

Web应用程序是一个特殊的Visual Studio项目。与Web站点的主要区别在于,当您构建项目时,所有代码文件都被编译为一个单独的程序集,该程序集放在bin目录中。您不会将代码文件部署到web服务器。您可以像在类库中那样,将共享代码文件放在任何位置,而不是为共享代码文件设置一个特殊的文件夹。因为Web应用程序包含不打算部署的文件,例如项目和代码文件,所以Visual Studio中有一个Publish命令,用于将网站输出到指定位置。

App_Code与Bin

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

后面的代码

此主题特定于.aspx和.ascx文件。此主题在新的应用程序框架(如ASP.NET MVC和ASP.NET网页)中的相关性越来越小,这些框架不使用代码尾文件。

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

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

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

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

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

Visual Studio

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

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

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

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

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

NuGet Package Restore在网站上不起作用,您必须手动安装软件包中列出的软件包。配置Package Restore现在可以用于启动NuGet 2.7的网站

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

在一个伞下有多个项目并建立项目之间的依赖关系。例如,对于PCS,我们可以在web中进行以下操作应用程序-Web门户通知控制器(用于发送电子邮件)业务层数据访问层异常管理器服务器实用程序WCF服务(所有平台通用)列表项目对类文件中的代码运行单元测试与ASP.NET页面关联参考以下类别与独立类中的页面和用户控件关联为整个站点创建单个部件的步骤控制为站点生成的程序集名称和版本号避免将源代码放在生产服务器上。(你可以避免将源代码部署到IIS服务器。在某些情况下,例如共享托管环境,您可能会担心未经授权访问IIS服务器上的源代码。(对于web站点项目,您可以通过在开发计算机并部署生成的程序集源代码的。然而,在这种情况下轻松更新网站的好处。)网站性能问题(对网站的第一请求可能需要编译网站,这可能导致延迟。如果网站运行在内存不足的IIS服务器,包括单个程序集使用的内存可能比多个组件。)

这听起来可能有点明显,但我认为这是一种误解,因为VisualStudio2005最初只是随网站一起提供的。如果你的项目涉及一个相当有限的网站,并且没有太多的逻辑或物理分离,那么这个网站就很好。然而,如果它确实是一个具有不同模块的web应用程序,许多用户可以在其中添加和更新数据,那么您最好使用该web应用程序。

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

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

如果您正在进行n层开发,我强烈推荐web应用程序模型。如果您正在做一个有限的网站或一个快速而肮脏的实现,那么网站模型可能有优势。

更详细的分析见:

Web应用程序项目和Web部署项目位于此处网站还是Web应用程序?

编译首先,编译是有区别的。网站不是在服务器上预编译的,而是在文件上编译的。可能是这是一个优势,因为当您想要更改Web中的某些内容时站点您只需从服务器下载一个特定的文件,更改它并把这个文件上传回服务器,一切都会正常。在Web中应用程序无法执行此操作,因为所有内容都是预编译的你最终只有一个dll。当您更改一个文件中的内容时您的项目必须重新编译所有内容。所以如果你愿意希望能够更改服务器上的某些文件。网站是更好的解决方案。它还允许许多开发人员开发一个网站。另一方面,如果您不希望代码您应该选择Web应用程序。这选项对于单元测试也更好,因为一个DLL文件在发布网站后创建。

项目结构项目的结构也存在差异。在Web应用程序中,您有一个项目文件,就像在普通应用程序中一样。在网站中,并没有传统的项目文件,只有解决方案文件。所有引用和设置都存储在web.config文件中。@Page指令对于包含与此页面关联的类的文件,@Page指令中有一个不同的属性。在Web应用程序中,它是标准的“CodeBehind”,在Web站点中使用“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" %> 

命名空间-在上面的示例中,您还可以看到另一个区别-如何创建命名空间。In-Web Application命名空间只是一个项目名称。在网站中有默认的命名空间ASP动态编译页面。编辑并继续-在Web应用程序中,“编辑并继续”选项为可用(要打开它,必须转到“工具”菜单,单击“选项”然后在调试中找到“编辑并继续”)。此功能不起作用在Web Site.ASP.NET MVCI中,如果要使用ASP.NET MVC(模型视图控制器)最佳和默认选项是Web应用程序。尽管可以在Web站点中使用MVC不建议使用。摘要-ASP.NET Web应用程序之间最重要的区别网站是编译。所以如果你在一个更大的项目上工作少数人可以修改它,最好使用网站。但如果你是做一个较小的项目,您也可以使用Web应用程序。

这取决于你在发展什么。

一个以内容为导向的网站会经常改变其内容,而网站更适合于此。

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