当我在 Visual Studio 中启动一个新的 ASP.NET 项目时,我可以创建一个 ASP.NET Web 应用程序,或者我可以创建一个 ASP.NET Web 站点。
ASP.NET Web 应用程序和 ASP.NET Web 站点之间有什么区别?为什么我会选择一个而不是其他?
根据我使用的 Visual Studio 版本,答案是否有所不同?
网站:
Web 站点项目即时编译。你最终得到了更多的 DLL 文件,这可能是一个痛苦。当您在一个目录中有页面或控件需要引用另一个目录中的页面和控件时,它也会出现问题,因为其他目录可能尚未编译到代码中。另一个问题可能是出版。
如果没有告诉 Visual Studio 不断重复使用相同的名称,它将为页面始终生成的 DLL 文件提供新名称。这可能会导致包含相同类名的 DLL 文件的几个密切副本,这将产生大量错误。 Web 站点项目是在 Visual Studio 2005 中引入的,但事实并非如此受欢迎。
Web 应用程序:
Web 应用程序项目是作为加载项创建的,现在作为 Visual Studio 2005 的 SP 1 的一部分存在。主要区别在于 Web 应用程序项目的工作方式类似于 Visual Studio 2003 附带的 Web 项目。它将在构建时将应用程序编译为单个 DLL 文件。为了更新项目,必须重新编译它并发布 DLL 文件以进行更改。
Web 应用程序项目的另一个不错的功能是从项目视图中排除文件要容易得多。在 “网站” 项目中,您排除的每个文件都使用文件名中的 excluded 关键字重命名。在 Web 应用程序项目中,项目只是跟踪项目视图中包含 / 排除的文件而不重命名,使事情变得更加整洁。
文章ASP.NET 2.0 - Web 站点与 Web 应用程序项目也给出了为什么使用一个而不是另一个的原因。以下是它的摘录:
- 您需要将大型 Visual Studio .NET 2003 应用程序迁移到 VS 2005 吗? 使用 Web 应用程序项目。
- 您想在不创建项目文件的情况下打开和编辑任何目录作为 Web 项目吗? 使用网站项目。
- 您需要在编译期间添加预构建和后构建步骤吗? 使用 Web 应用程序项目。
- 您需要使用多个 Web 项目构建 Web 应用程序吗? 使用 Web 应用程序项目。
- 您想为每个页面生成一个程序集吗? 使用网站项目。
- 您更喜欢动态编译和处理页面而不在每个页面视图上构建整个站点? 使用网站项目。
- 您更喜欢单页代码模型到代码隐藏模型吗? 使用网站项目。
Web 应用程序项目与 Web 站点项目 (MSDN)解释了 Web 站点和 Web 应用程序项目之间的差异。此外,它还讨论了在 Visual Studio 中进行的配置。
Web 站点是您部署到 ASP.NET Web 服务器(如 IIS)的内容。只是一堆文件和文件夹。网站中没有任何内容可以将您与 Visual Studio 联系起来(没有项目文件)。代码生成和网页编译(例如. aspx,.ascx,.master) 在运行时动态完成,框架检测到这些文件的更改并自动重新编译。您可以在特殊的 App_Code 文件夹中放置要在页面之间共享的代码,也可以预编译它并将程序集放在 Bin 文件夹中。
Web 应用程序是一个特殊的 Visual Studio 项目。 与 Web 站点的主要区别在于,在构建项目时,所有代码文件都编译为单个程序集,该程序集位于 bin 目录中。您不会将代码文件部署到 Web 服务器。您可以将它们放在任何位置,而不是像在类库中那样放置共享代码文件的特殊文件夹。由于 Web 应用程序包含不打算部署的文件(例如项目和代码文件),因此 Visual Studio 中有一个 “ 发布”命令可将网站输出到指定位置。
部署共享代码文件通常是个坏主意,但这并不意味着您必须选择 Web 应用程序。您可以拥有一个引用类库项目的 Web 站点,该项目包含 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 项目,因此您将获得 Web 站点中不具备的一些功能。例如,您可以使用构建事件来执行各种任务,例如缩小和 / 或组合 Javascript 文件。
Visual Studio 2010 中引入的另一个不错的功能是Web.config 转换 。 这在网站中也不可用。 现在可以在 VS 2013 中使用网站。
构建 Web 应用程序比构建 Web 站点更快,特别是对于大型站点。这主要是因为 Web 应用程序不编译标记代码。在 MVC 中,如果将 MvcBuildViews 设置为 true,则它会编译标记代码并获得错误检测,这非常有用。不好的一面是,每次构建解决方案时,它都会构建完整的站点,这可能会很慢且效率低下,特别是如果您不编辑站点。我发现自己打开和关闭 MvcBuildViews(这需要一个项目卸载)。另一方面,使用网站,您可以选择是否要将网站构建为解决方案的一部分。如果您选择不这样做,那么构建解决方案的速度非常快,如果您进行了更改,则可以始终单击 “网站” 节点并选择 “构建”。
在 MVC Web 应用程序项目中,您可以使用额外的命令和对话框来执行常见任务,例如 “添加视图”,“转到视图”,“添加控制器” 等。这些在 MVC 网站中不可用。
如果使用 IIS Express 作为开发服务器,则可以在 “网站” 中添加虚拟目录。 Web 应用程序中不提供此选项。
NuGet 包还原在网站上不起作用,您必须手动安装 packages.config 上列出的包 Package Restore 现在适用于启动 NuGet 2.7 的网站
网站 = 当图形设计者创建网站时使用,程序员只编辑一页或两页
Web 应用程序 = 在程序员创建应用程序时使用,图形设计人员只编辑一个或两个分页 / 图像。
网站可以使用任何 HTML 工具而无需开发人员工作室,因为项目文件不需要更新等。当团队主要使用开发人员工作室并且代码内容很高时,Web 应用程序是最好的。
(在编译时 Web 应用程序中发现了一些编码错误,这些错误在运行时之前在网站中找不到。)
警告: 我多年前写过这个答案,从那时起就没有使用过 Asp.net。我希望事情现在已经开始了。