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

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

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


当前回答

网站是您部署到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应用程序=当应用程序由程序员创建且图形设计师仅编辑一页或两页/图像时使用。

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

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

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

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

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

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

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

更详细的分析见:

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

这始终取决于客户的要求。ASP.NET仅包含用户需要的灵活功能,以确保应用程序的安全性和易于维护。

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

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

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

总结以上一些答案:

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

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

Web应用程序:不可能。编辑页面,将更改存档到源代码管理,然后构建和部署整个站点。专业:保持高质量的项目。

发展问题

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

Web应用程序:项目结构类似于WebForms项目,具有.csproj文件。asp页面的类名必须是唯一的。专业:简单(智能)。缺点:没有,因为网络应用程序仍然很简单。