当我在 Visual Studio 中启动一个新的 ASP.NET 项目时,我可以创建一个 ASP.NET Web 应用程序或者我可以创建一个 ASP.NET 网站。
ASP.NET Web 应用程序和 ASP.NET 网站有什么区别?为什么我会选择一个而不是另一个?
答案是否会根据我使用的 Visual Studio 版本而有所不同?
当我在 Visual Studio 中启动一个新的 ASP.NET 项目时,我可以创建一个 ASP.NET Web 应用程序或者我可以创建一个 ASP.NET 网站。
ASP.NET Web 应用程序和 ASP.NET 网站有什么区别?为什么我会选择一个而不是另一个?
答案是否会根据我使用的 Visual Studio 版本而有所不同?
网站项目是即时编译的。你最终会得到更多的 DLL 文件,这可能会很痛苦。当您在一个目录中有页面或控件需要引用另一个目录中的页面和控件时,它也会产生问题,因为另一个目录可能尚未编译到代码中。另一个问题可能是出版。
如果 Visual Studio 没有被告知要不断地重复使用相同的名称,它将一直为页面生成的 DLL 文件提供新名称。这可能导致有多个包含相同类名的 DLL 文件的紧密副本,这将产生大量错误。Web Site 项目是随 Visual Studio 2005 引入的,但事实证明它并不流行。
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 项目。与网站的主要区别在于,当您构建项目时,所有代码文件都被编译成一个程序集,该程序集放置在 bin 目录中。您不会将代码文件部署到 Web 服务器。您可以将它们放在任何地方,而不是为共享代码文件创建一个特殊文件夹,就像在类库中所做的那样。由于 Web 应用程序包含不打算部署的文件,例如项目和代码文件,因此 Visual Studio 中有一个发布命令可将网站输出到指定位置。
部署共享代码文件通常不是一个好主意,但这并不意味着您必须选择 Web 应用程序。您可以拥有一个引用类库项目的网站,该类库项目包含网站的所有代码。Web 应用程序只是一种方便的方法。
本主题特定于 .aspx 和 .ascx 文件。该主题与不使用代码隐藏文件的新应用程序框架(例如 ASP.NET MVC 和 ASP.NET 网页)的相关性越来越低。
通过将所有代码文件编译到单个程序集中,包括.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 应用程序不编译标记代码。在 MVC 中,如果您将 MvcBuildViews 设置为 true,那么它会编译标记代码并获得错误检测,这非常有用。不利的一面是,每次构建解决方案时,它都会构建完整的站点,这可能会很慢且效率低下,尤其是在您不编辑站点的情况下。我发现自己打开和关闭 MvcBuildViews(这需要卸载项目)。另一方面,通过网站,您可以选择是否要将站点构建为解决方案的一部分。如果您选择不这样做,那么构建解决方案的速度非常快,如果您进行了更改,您可以随时单击网站节点并选择构建。
在 MVC Web 应用程序项目中,您有额外的命令和对话框用于常见任务,例如“添加视图”、“转到视图”、“添加控制器”等。这些在 MVC 网站中不可用。
如果您使用 IIS Express 作为开发服务器,您可以在网站中添加虚拟目录。此选项在 Web 应用程序中不可用。
NuGet 包还原在网站上不起作用,您必须手动安装 packages.config 中列出的包包还原现在适用于从 NuGet 2.7 开始的网站
网站=当网站由平面设计师创建并且程序员只编辑一两个页面时使用
Web 应用程序= 当应用程序由程序员创建并且图形设计师只编辑一两个页面/图像时使用。
网站可以使用任何 HTML 工具进行工作,而无需开发人员工作室,因为不需要更新项目文件等。当团队主要使用开发人员工作室并且代码内容高时,Web 应用程序是最好的。
(一些编码错误是在编译时在 Web 应用程序中发现的,直到运行时才在网站中发现。)
警告: 我多年前写了这个答案,从那以后就没有使用过 Asp.net。我预计事情现在已经开始了。
除非您特别需要动态编译的项目,否则不要使用网站项目。
为什么?因为当你试图改变或理解你的项目时,网站项目会让你陷入困境。Visual Studio 中的静态类型查找功能(例如查找用法、重构)将永远用于任何规模合理的项目。有关详细信息,请参阅 Visual Studio 中的 Stack Overflow 问题Slow “Find All References”。
我真的不明白为什么他们在 Visual Studio 2005 中放弃了 Web 应用程序,因为它们会导致痛苦、理智流失、生产力痈的网站项目类型。
MSDN中有一篇文章描述了这些差异:
顺便说一句:关于该主题有一些类似的问题,例如:
这听起来可能有点明显,但我认为这是一个被误解的东西,因为 Visual Studio 2005 最初只与网站一起提供。如果您的项目处理的网站相当有限并且没有太多的逻辑或物理分离,那么该网站就可以了。但是,如果它确实是一个具有不同模块的 Web 应用程序,许多用户在其中添加和更新数据,那么您最好使用 Web 应用程序。
网站模型的最大优点是该app_code
部分中的任何内容都是动态编译的。您可以在不完全重新部署的情况下进行 C# 文件更新。然而,这是一个巨大的牺牲。很多事情都发生在难以控制的幕后。命名空间很难控制,并且默认情况下,特定的 DLL 使用会出现在窗口之外,app_code
因为所有内容都是动态编译的。
Web 应用程序模型没有动态编译,但您可以控制我提到的内容。
如果您正在做 n 层开发,我强烈推荐 Web 应用程序模型。如果您正在做一个有限的网站或快速而肮脏的实现,那么网站模型可能具有优势。
更详细的分析可见:
来自 MCTS 自定进度培训套件考试 70-515 书:
使用 Web 应用程序(项目),
- 您可以创建 MVC 应用程序。
- Visual Studio 将文件列表存储在项目文件(.csproj 或 .vbproj)中,而不是依赖于文件夹结构。
- 不能混合使用 Visual Basic 和 C#。
- 您不能在不停止调试会话的情况下编辑代码。
- 您可以在多个 Web 项目之间建立依赖关系。
- 您必须在部署之前编译应用程序,这会阻止您在另一个页面无法编译时测试一个页面。
- 您不必将源代码存储在服务器上。
- 您可以控制程序集名称和版本。
- 部署后不重新编译就无法编辑单个文件。
这取决于你正在开发什么。
一个以内容为导向的网站的内容会经常变化,而网站则更好。
应用程序倾向于将其数据存储在数据库中,并且其页面和代码很少更改。在这种情况下,最好有一个 Web 应用程序,其中程序集的部署受到更多控制并且对单元测试有更好的支持。
Compilation
首先是编译上的区别。网站不是在服务器上预编译的,而是在文件上编译的。这可能是一个优势,因为当您想更改网站中的某些内容时,您只需从服务器下载特定文件,更改它并将此文件上传回服务器,一切都会正常工作。在 Web 应用程序中,您不能这样做,因为一切都是预编译的,并且您最终只有一个 dll。当您更改项目的一个文件中的某些内容时,您必须再次重新编译所有内容。因此,如果您希望有可能更改服务器网站上的某些文件,对您来说是更好的解决方案。它还允许许多开发人员在一个网站上工作。另一方面,如果您不希望您的代码在服务器上可用,您应该选择 Web 应用程序。
Project structure
项目的结构也有所不同。在 Web 应用程序中,您有一个项目文件,就像在普通应用程序中一样。在网站中没有传统的项目文件,你只有解决方案文件。所有引用和设置都存储在 web.config 文件中。
@Page directive
@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" %>
命名空间 - 在上面的示例中,您还可以看到另一个区别 - 命名空间是如何创建的。在 Web 应用程序中,命名空间只是项目的名称。在网站中有用于动态编译页面的默认命名空间 ASP。
编辑并继续 - 在 Web 应用程序中编辑并继续选项可用(要打开它,您必须转到工具菜单,单击选项,然后在调试中找到编辑并继续)。此功能在 Web Site.ASP.NET MVC 中不起作用如果您想使用以下方式开发 Web 应用程序
ASP.NET MVC(模型视图控制器)最好的默认选项是 Web 应用程序。虽然可以在 Web 站点中使用 MVC,但不推荐。
摘要 - ASP.NET Web 应用程序和网站之间最重要的区别是编译。因此,如果您在一个较大的项目中工作,几个人可以修改它,最好使用网站。但是,如果您正在做一个较小的项目,您也可以使用 Web 应用程序。
是的,Web 应用程序比网站好得多,因为 Web 应用程序给了我们自由:
将多个项目放在一个保护伞下,并在它们之间建立项目依赖关系。例如,对于 PCS,我们可以在 Web 应用程序中进行以下操作 -
对与 ASP.NET 页面关联的类文件中的代码运行单元测试
主要区别之一是网站动态编译并创建动态程序集。Web 应用程序编译成一个大型程序集。
Visual Studio 2008 消除了两者之间的区别。
应用程序通常在部署之前编译,因为网站使用 app_code 目录。当应用程序代码文件夹中有任何更改时,服务器将重新编译代码。这意味着您可以在网站上动态添加/更改代码。
应用程序的优点是无需重新编译,因此初始启动时间会更快。
我建议您观看 ASP.NET 网站上的视频Web 应用程序项目和 Web 部署项目,它非常详细地解释了不同之处,这对我很有帮助。
顺便说一句,不要被标题弄糊涂了,视频的很大一部分解释了网站项目和 Web 应用程序项目之间的区别以及为什么微软在 Visual Studio 2005 中重新引入了 Web 应用程序项目(您可能已经知道,它最初仅附带网站项目,然后在 SP1 中添加了 Web 应用程序项目)。一个很棒的视频,我强烈推荐给任何想知道区别的人。
“网站”的代码位于特殊的 App_Code 目录中,并在运行时编译成多个 DLL(程序集)。一个“网络应用程序”被预编译成一个单独的 DLL。
网站和项目>>网站是使用 Visual Studio 创建 ASP.NET 应用程序的两种不同方法。一个是无项目的,另一个是项目环境。差异如下
使用这两种方法没有太大的基本区别。但是,如果您要创建需要较长时间的网站,请选择项目环境。
它始终取决于您的客户的要求。ASP.NET 仅包含用户为应用程序的安全性和易于维护而需要的灵活功能。
您可以将Web 应用程序视为在 ASP.NET 框架内运行的二进制文件。网站作为静态网页,您可以查看并轻松部署源代码。
但这两种 ASP.NET 技术的优缺点各有千秋。
Web 应用程序项目模型
网站项目模型
网站 - 不会创建任何解决方案文件。如果我们想创建网站,则不需要 Visual Studio。
Web 应用程序 - 将创建一个解决方案文件。如果我们要创建 Web 应用程序应该需要 Visual Studio。它将.dll
在 bin 文件夹中创建一个文件。
在 Web 应用程序项目中,Visual Studio 需要用于页面和用户控件的附加 .designer 文件。网站项目不需要这种开销。标记本身被解释为设计。
绝对是 Web 应用程序,单个 DLL 文件,易于维护。但是网站更灵活;您可以随时随地编辑 aspx 文件。
网站:它会自动生成 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 应用程序中,您可以创建项目功能的层,并可以通过将其划分为多个项目来创建它们之间的相互依赖关系,但您永远无法在网站上这样做。
总结上面的一些答案:
灵活性,您可以对网页进行实时更改吗?
网站:可能。优点:短期利益。缺点:项目混乱的长期风险。
网络应用程序:缺点:不可能。编辑页面,将更改存档到源代码管理,然后构建和部署整个站点。优点:保持高质量的项目。
发展问题
网站:没有 .csproj 文件的简单项目结构。两个 .aspx 页面可以具有相同的类名而不会发生冲突。随机项目目录名称导致构建错误,例如为什么 .net 框架与它自己生成的文件冲突以及为什么 .net 框架与它自己生成的文件冲突。优点:简单(简单化)。缺点:不稳定。
Web App : 类似于 WebForms 项目的项目结构,带有一个 .csproj 文件。asp 页面的类名必须是唯一的。优点:简单(智能)。缺点:没有,因为 Web 应用程序仍然很简单。