什么是ASP.NET中Web应用程序和网站之间的区别?
什么是ASP.NET中Web应用程序和网站之间的区别?
当我在 Visual Studio 中开始一个新的 ASP.NET 项目时,我可以创建一个 ASP.NET Web 应用程序或者我可以创建一个 ASP.NET Web 站点。
ASP.NET Web 应用程序和 ASP.NET Web 站点有什么区别?为什么我会选择其中之一?
这个答案是否因我使用的 Visual Studio 版本而异?
Web Site是部署到类似IIS的ASP.NET Web服务器的一堆文件和文件夹。在Web Site中没有任何内容将你限制在Visual Studio上(没有项目文件)。Web页面的代码生成和编译(例如.aspx、.ascx、.master)是在运行时动态完成的,对这些文件的更改会被框架检测到并自动重新编译。你可以将希望在多个页面之间共享的代码放在特殊的App_Code文件夹中,或者将其预编译并将程序集放在Bin文件夹中。
Web Application是一种特殊的Visual Studio项目。与Web Site的主要区别在于,当你构建该项目时,所有的代码文件都会被编译成一个单独的程序集,该程序集将放置在bin目录中。你不需要将代码文件部署到Web服务器上。与为共享的代码文件设置特殊文件夹不同,你可以将它们放在任何地方,就像你在类库中所做的一样。由于Web Applications包含不应该部署的文件,例如项目和代码文件,在Visual Studio中有一个发布命令,将Web Site输出到指定的位置。
App_Code vs Bin
通常而言,部署共享的代码文件是不太合适的,但这并不意味着你必须选择Web Application。你可以拥有一个引用了包含Web Site所有代码的类库项目的Web Site。Web Applications只是一种方便的实现方式。
CodeBehind
本主题针对的是 .aspx 和 .ascx 文件。在新的应用程序框架中,如 ASP.NET MVC 和 ASP.NET Web Pages 中,不再使用 CodeBehind 文件,因此本主题的相关性正在降低。
在 Web 应用程序中,所有代码文件都被编译成单个程序集,包括 .aspx 页面和 .ascx 控件的 codebehind 文件。因此,即使进行微小的更改,您也必须重新构建,而且无法进行实时更改。这在开发过程中可能会很麻烦,因为您必须不断重建以查看更改,而 Web 站点可以通过运行时检测更改,并自动重新编译页面/控件。
让运行时管理 codebehind 程序集会减轻您的工作量,因为您无需担心页面/控件的唯一名称,也不需要将它们组织成不同的命名空间。
我并不是说部署代码文件总是一个好主意(特别是共享代码文件的情况下),但是 codebehind 文件应该只包含执行 UI 特定任务、连接事件处理程序等的代码。您的应用程序应该分层,以便重要的代码始终位于 Bin 文件夹中。如果是这种情况,那么部署 codebehind 文件就不应被视为有害。
Web 应用程序的另一个限制是,您只能使用项目所使用的语言。在 Web 站点中,您可以将一些页面用 C# 编写,一些页面用 VB 编写,等等。无需特殊的 Visual Studio 支持。这就是构建提供程序可扩展性的美。
此外,在 Web 应用程序中,您无法在页面/控件中获取错误检测,因为编译器仅编译您的 codebehind 类,而不编译标记代码(在 MVC 中,您可以使用 MvcBuildViews 选项来修复此问题),标记代码是在运行时编译的。
Visual Studio
由于Web应用程序是Visual Studio项目,因此您可以获得一些Web站点中不可用的功能。例如,您可以使用构建事件执行各种任务,例如缩小和/或合并Javascript文件。
Visual Studio 2010中引入的另一个不错的功能是Web.config转换。这在Web站点中也不可用,但现在在VS 2013中可以使用。
构建Web应用程序比构建Web站点更快,特别是对于大型站点。这主要是因为Web应用程序不编译标记代码。在MVC中,如果将MvcBuildViews设置为true,则它会编译标记代码,并且您可以获得错误检测,这非常有用。不足之处是,每次构建解决方案时,它都会构建完整的站点,这可能很慢和低效,特别是如果您没有编辑站点。我总是会打开和关闭MvcBuildViews(这需要卸载项目)。另一方面,对于Web站点,您可以选择是否将站点作为解决方案的一部分进行构建。如果选择不这样做,则构建解决方案非常快,如果您进行了更改,则始终可以单击Web站点节点并选择“构建”。
在MVC Web应用程序项目中,您可以执行常见任务(例如“添加视图”,“转到视图”,“添加控制器”等)的额外命令和对话框。这些在MVC Web站点中不可用。
如果在Web站点中使用IIS Express作为开发服务器,则可以添加虚拟目录。这在Web应用程序中不可用。
NuGet Package Restore does not work on Web Sites, you have to manually install packages listed on packages.config 现在,使用NuGet 2.7及以上版本,Web站点也支持包恢复功能,无需手动安装列在packages.config中的软件包。了解更多
网站:
网站项目是即时编译的。这会生成更多的DLL文件,这可能会很麻烦。当您的页面或控件位于一个目录中需要引用另一个目录中的页面和控件时,可能会出现问题,因为另一个目录尚未编译到代码中。发布时可能出现另一个问题。
如果没有告诉Visual Studio始终重复使用相同的名称,它将不断生成新的DLL文件名称。这可能导致有多个包含相同类名的DLL文件,这会产生大量错误。网站项目是在Visual Studio 2005中引入的,但事实证明它并不流行。
Web应用程序:
Web应用程序项目作为添加组件创建,现在作为Visual Studio 2005的SP 1的一部分存在。主要区别在于Web应用程序项目的设计是为了与Visual Studio 2003随附的Web项目类似。它会在构建时将应用程序编译为单个DLL文件。要更新项目,必须重新编译并发布DLL文件以进行更改。
Web应用程序项目的另一个好的特点是更容易从项目视图中排除文件。在Web站点项目中,您排除的每个文件都会在文件名中重命名为“已排除”关键字。在Web应用程序项目中,项目仅跟踪要包含/排除的文件,而不重命名它们,使事情更加整洁。
文章ASP.NET 2.0 - Web Site vs Web Application project也提供了使用一个而不是另一个的原因。这是其中的一部分摘录:
- 您需要将大型Visual Studio .NET 2003应用程序迁移到VS
2005?使用Web应用程序项目。- 您想打开并编辑任何目录作为Web项目,而无需
创建项目文件?使用Web站点
项目。- 您需要在编译期间添加预建和后建步骤吗?
使用Web应用程序项目。- 您需要使用多个Web构建Web应用程序
项目?使用Web应用程序项目。- 您想为每个页面生成一个程序集吗?使用Web站点项目。
- 您更喜欢动态编译和在构建的每个页面视图上工作
整个站点?使用Web站点项目。- 您喜欢单页代码模型而不是代码后台模型吗?使用Web站点项目。
Web应用程序项目与Web站点项目(MSDN)解释了Web站点和Web应用程序项目之间的差异。此外,它还讨论了在Visual Studio中进行的配置。