Web 应用程序项目与 Visual Studio 中的网站项目

在Visual Studio可以创建 Web 应用程序项目 或 网站项目。 通过选择 新建项目打开项目 创建或打开一个 Web 应用程序项目在Visual Studio 文件 菜单。 通过选择 新建网站打开网站 创建或打开一个网站项目在"文件"菜单。

每种项目类型各有优缺点,要选择可以满足需要的最佳项目类型,应了解各项目类型之间的差异。 创建项目之前,必须选择合适的项目类型,原因是从一种项目类型转换到另一种项目类型并不可行。

备注

在某些情况下,无法进行选择。例如,因此,如果要创建ASP.NET MVC应用程序,您必须使用 Web 应用程序项目。

本主题包含以下各节:

  • 方案

  • 差异摘要

  • 项目文件结构

  • 编译

  • 部署

方案

Web 应用程序项目的情况是优先选择包括:

  • 希望能够使用Visual Studio调试器的 编辑并继续 功能。

  • 需要对与 ASP.NET 页关联的类文件中的代码运行单元测试。

  • 需要从独立类中引用与页和用户控件关联的类。

  • 要在多个web项目之间的项目依赖项。

  • 您希望编译器为整个站点创建单个程序集。

  • 您要控制为站点生成的程序集的名称和版本号。

  • 需要使用 MSBuild 或 Team Build 编译项目。 例如,您可能希望添加prebuild和postbuild步骤。

  • 需要避免将源代码放置在生产服务器上。

  • 需要使用 Visual Studio 中提供的自动化部署工具。

优先选择网站项目的情况包括:

  • 可以在单个web项目中包含C#和Visual Basic代码。 (默认情况下, Web 应用程序编译根据项目文件的语言设置。 可以设置例外情况,但相对较难。)

  • 需要在 Visual Studio 中打开生产站点和使用 FTP 对其进行实时更新。

  • 不希望必须显式编译项目才能部署项目。

  • 如果预编译站点,您希望编译器为站点创建多个程序集,可以是每个页面或用户控件一个程序集,也可以是每个文件夹一个或多个程序集。

  • 您希望能够通过仅将新版本复制到生产服务器,或通过在生产服务器上直接编辑文件来更新生产中的各个文件。

  • 如果预编译站点,您希望能够更新各 ASP.NET 网页(.aspx文件),而无需重新编译整个网站。

  • 您希望在生产服务器上保留源代码,以便用作附加备份副本。

差异摘要

下表总结了主要差异。

区域

Web 应用程序项目

网站项目

项目文件结构

Visual Studio 项目文件(.csproj 或 .vbproj)存储有关项目的信息,如项目中包含的文件列表和项目间的任何引用。

不存在项目文件(.csproj 或 .vbproj)。 文件夹结构中的所有文件自动包含在站点中。

编译

  • 在用于开发或源代码控制的计算机上显式编译源代码。

  • 默认情况下,编译代码文件(不包括 .aspx 和 .ascx 文件)会生成一个程序集。

  • 源代码通常是在站点安装或更新后首次收到请求时在服务器上通过 ASP.NET 动态(自动)进行编译的。

    可以预编译站点(在开发计算机或服务器上预先编译)。

  • 默认情况下,编译会生成多个程序集。

命名空间

默认情况下,将显式命名空间添加到页面、控件和类中。

默认情况下,不将显式命名空间添加到页面、控件和类中,但您可以手动添加它们。

部署

  • 将程序集复制到服务器。 程序集通过编译应用程序生成。

  • Visual Studio提供与集成的Web部署工具(IIS web部署工具)可以自动执行许多部署任务。

  • 您将应用程序源文件复制到已安装 IIS 的计算机上。

  • 如果在开发计算机上预编译站点,您可以将通过编译产生的程序集复制到 IIS 服务器。

  • Visual Studio提供用于部署的工具,但是,它们不工具自动执行的部署任务可用于 Web 应用程序项目。

项目文件结构

Web 应用程序项目使用 Visual Studio 项目文件(.csproj 或 .vbproj)来跟踪有关项目的信息。 这使得可以指定哪些文件中或在生成过程中,将该文件编译的项目中排除,和。

对于网站项目,文件夹结构中的所有文件自动视为该网站中。 如果要从生成中排除某些文件,必须从网站项目文件夹中移除文件或将其文件扩展名更改为不由IIS编译和提供的扩展名。

使用项目文件的优点在 Web 应用程序项目如下:

  • 易于暂时从站点移除文件,但仍确保不会失去对它们的跟踪,因为这些文件保留在文件夹结构中。 例如,如果页面没有为部署准备就绪,您可以暂时从生成中排除它,而无需从文件夹结构中将其删除。 您可以部署编译的程序集,然后再次将文件包括在项目中。 这在使用源代码管理储存库时尤为重要。

在网站项目中使用无项目文件的文件夹结构具有以下优点:

  • 您不必专门在 Visual Studio 中管理项目的结构。 例如,通过使用文件资源管理器中,可以将文件复制到项目中或从项目中删除它们。

编译

对于 Web 应用程序项目,通常生成项目在Visual Studio中或通过使用不是生产IIS服务器的计算机上的ASP.NET批编译器。 所有代码都选件类文件和独立选件类隐藏文件在项目编译为单个程序集,在 Web 应用程序项目的Bin文件夹中放置。 (.aspx和.ascx文件进行动态编译以与网站项目类似的方式执行。)

对于网站项目,您不必手动编译项目。 网站项目由ASP.NET动态通常内置(在开发计算机和生产IIS服务器上)。 您可以在批处理编译模式(通常为每个文件夹生成一个程序集)和固定编译模式(通常为每个页面或用户控件生成一个程序集)之间选择。

编译模型的优点 Web 应用程序项目中包括:

  • 您可以使用 MSBuild 来创建自定义批处理编译过程。

  • 指定程序集特性(如名称和版本)非常简单。

  • 事先编译可确保在生产服务器上编译站点期间用户无须等待。 (如果站点非常大,网站项目的动态编译可能需要花费大量时间。 动态编译在更新站点之后收到站点资源请求时发生,并且当编译所需资源时,触发编译的请求可能会被延迟。 如果延迟不可接受,则可以预编译站点。 但因此会失去动态编译的某些优点。)

  • 您可以完全控制项目文件夹结构中放置代码文件的位置,以及项目中的类互相引用的方式。 (动态编译要求在整个站点中使用的所有类的源代码必须位于 App_Code 文件夹中。 您不能从 App_Code 中的类引用页面或用户控件类。)

网站项目的编译模型具有以下优点:

  • 您可以测试特定的页面,而不管其他页面的状态。 这是因为运行单个页面不需要成功编译整个站点,仅需编译该页面和该页面所依赖的任何组件,如 App_Code 文件夹或 Global.asax 文件中的代码。 (在 Web 应用程序项目,因此,如果任何位置存在编译错误该站点,则不能创建程序集不能测试所编译站点即使的部分。

  • 在生产中更新网站非常容易。 可以更新生产服务器上的各个源代码文件,而无需以显式方式重新编译站点。 即使由于编译错误其他文件未准备就绪,也可以更新各个为部署准备就绪的文件。 还可以直接在 Visual Studio 中打开生产 IIS 服务器上的网站,并实时更新该网站。

  • 在某些情况下,预编译为多个程序集具有性能优势。 一个典型示例是具有许多页面,并为这些页面编写了大量代码的站点。 其中大多数页面极少被请求,只有某些页面经常受到使用。 如果将这样的站点编译成多个程序集,生产服务器就可以仅加载当前请求所需的程序集。 如果未请求某个页面,则不会加载其对应的程序集。

备注

在性能上没有差异网站项目与 Web 应用程序项目之间。唯一明显的例外就是那些已经指出的例外,在实际使用时,它们仅适用于非常大的站点。第一个请求绑定到该网站可能需要对站点进行编译,这可能会导致延迟。此外,如果该网站在较短的内存中的IIS服务器运行,包括单个程序集的整个站点要比对多个程序集可能使用更多的内存是必需的。

部署

若要部署 Web 应用程序项目,您复制已通过编译到IIS服务器的项目创建的程序集。 相反,部署网站项目,通常将项目源文件复制到IIS服务器。

部署策略的优点 Web 应用程序项目中包括:

  • 可以避免将源代码部署到 IIS 服务器。 在某些情况下,例如在共享承载环境中,您可能会关注对 IIS 服务器上源代码进行的未经授权的访问。 (对于网站项目,则可以预编译在开发计算机和部署所生成的程序集避免此风险而不是源代码。 不过,在这种情况下,会失去轻松更新站点的某些好处。)

  • 除将程序集或代码复制到服务器之外,部署通常还涉及其他任务。 例如,数据库脚本可能必须在生产中运行,Web.config 文件中的连接字符串可能需要针对生产服务器进行更改。 Visual Studio提供了一些如一键式发布将 Web 应用程序项目自动化其中的许多任务。 这些工具对于网站项目不可用。

网站项目部署策略的优点的包括:

  • 如果做少量更改到网站,您不必重新部署整个站点。 而是可以只将更改过的文件复制到生产 IIS 服务器。 另外,还可在生产服务器上直接编辑文件。 (因为 Web 应用程序项目的代码文件编译成单个程序集文件,则必须部署整个站点即使进行少量更改,因此,除非更改是针对.aspx或.ascx文件。)

请参见

概念

用于 Visual Studio 和 ASP.NET 的 Web 部署内容映射

其他资源

Web Application Projects vs Web Site Projects