Scenario
|
Web Application Project
|
Web Site Project
|
Project definition
|
跟
Visual Studio .NET 2003
类似,由于项目文件的存在,只有被项目文件所引用的文件才会在
Solution Explorer
中出现。而且只有这些文件才会被编译。可以很容易的把一个
ASP.NET
应用拆分成多个
Visual Studio
项目。可以很容易的从项目中和源代码管理中排除一个文件。
|
一个目录结构就是一个
WEB
项目。没有项目文件存在。这个目录下的所有文件,都被作为项目的一部分而存在。 我们实际部署的一个网站,部署上当然不会有任何项目文件存在,如果你想对这个网站进行修改,用这种编程模型就非常适合。我们根本不用在乎这个
WEB
站点中,那些文件属于哪个项目。
|
编译和生成
|
跟
Visual Studio .NET 2003
的
Web
应用项目编译模式几乎一样。
项目中的所有的
code-behind
类文件和独立类文件都被编译成一个独立应用程序集。这个应用程序集被放在
Bin
目录下。因为是一个独立的应用程序集,你能够指定应用程序集的名字、版本、输出位置等信息。
例如:
Model-View-Controller (MVC)
模式就可以在这里很好的被使用。因为它允许在
WEB
页面和
WEB
用户控件中引用一个独立的类。
|
编译(
Build
)命令仅仅是测试这个
WEB
站点是否编译正确,调试一个
WEB
站点项目的时候,是通过依赖你的源代码文件,
ASP.net
进行动态编译页面和类来实现的。
预编译站点和动态编译站点用的是同一个
compilation semantics
,你可以通过预编译来提高站点的性能。
ASP.net
动态编译系统提供了两种模型:默认的
batch
编译模型和
fixed-names
编译模型。
batch
编译模型中,被编译成多个应用程序集(典型的是每一个目录被编译成一个)。这时候你看应用程序集,很难对应上是哪个目录。
fixed-names
编译模型中,网站的每个页面或者每个用户控件被编译成一个应用程序集。
|
Iterative development
|
调试或者运行
Web
页面的时候,你必须全部编译整个
WEB
项目。
编译整个
WEB
项目通常比较快,因为
Visual Studio
使用了增量编译模式,仅仅只有文件被修改后,这部分才会被增量编译进去。
|
你可以配置
Visual Studio 2005
的编译属性:编译整个站点、编译一个指定页面、或者什么都不作。在最后一种情况下,当你运行一个
WEB
站点的时候,
Visual Studio
仅打开一个浏览器,并访问当前或者起始页,当这个请求被发送后,
ASP.net
才开始动态编译。
这种模式下,页面被动态编译或者被编译成不同应用程序集,所以如果你调试或者运行一个页面的时候,不需要整个项目被编译通过。有错误的部分跟你使用的部分可以互不干扰。
默认情况下,当你运行或调试任何
WEB
页的时候,
Visual Studio
完全编译
Web Site
项目。
这么做可以看到编译时的所有错误。但是,在开发进程中,完全编译整个站点会是相当慢的。所以推荐你在开发调试中,只编译当前页。
|
部署
|
因为所有的类文件被编译成一个应用程序集,当你部署的时候,只需要把这个应用程序集和
.aspx
文件、
.ascx
文件以及其它静态内容文件一起部署。
这种模型下,
.aspx
文件将不被编译,当浏览器访问这个页面的时候,才会被动态编译。
不过,如果你使用
Web Deployment Projects (
一个
Visual Studio 2005
的插件,没有被默认包含到
VS2005
中
),
你就可以把
.aspx
文件也编译进入一个应用程序集中。
如果你只修改了小小的一行代码,你也需要把整个项目的所有代码都编译,并且发布包含所有代码的这个应用程序集。
|
使用
Visual Studio
的
Publish Website
命令,你可以把
.aspx
文件
和
code-behind
文件编译成应用程序集,所以你看到的编译后的
.aspx 文件头发生了变化。(注意:
Build
命令并不会给你可部署的应用程序集)
最新版本的
Publish
将支持仅编译
code-behind
文件,这样部署的时候,将不改变
.aspx
文件。
默认是在
Bin
目录下预编译成几个应用程序集,典型的是一个目录对应一个应用程序集。
fixed-names
部署选项可以让每一个
WEB
页面或者每个
WEB
用户控件创建一个应用程序集,这样每个页面都有一个可部署的应用程序集。但是,
fixed-names
部署选项会增多应用程序集的个数,而且实际内存使用也会增大。
|
从
Visual Studio .NET 2003
升级
|
因为跟
VS2003
采用了一样的
WEB
项目开发模型,升级是非常非常简单的。
|
Web site
项目的编译选项不同导致了它跟
Visual Studio .NET 2003WEB
项目的极大不同。
虽然微软提供了一个转换向导,但是如果你的项目如果是一个复杂的
VS2003
项目,使用这个转换向导后,你还需要对照转换手册,做很多工作。
如果你要从
VS2003
升级,建议不要用这种
WEB
站点开发模版。而是使用
Web application
项目。
|
Option or Task
|
Web Application Projects
|
Web Site Projects
|
你有一个大型的
Visual Studio .NET 2003 Web
应用需要迁移到
VS2005
。
|
√
|
|
喜欢使用
single-page code
模型来开发网站页面。而不是使用
code-behind
模型来编写网站页面
|
|
√
|
喜欢采用下面的方式编写网站:
|
|
√
|
在编写页面时候,为了可以快速的看到编写效果,动态编译该页面,马上可以看到效果,不用编译整个站点。
|
||
(就是说,只需要保存文件,然后在浏览器中刷新一下,就可以看到自己刚刚做的效果)
|
||
需要控制编译后应用程序集的名字
|
√
|
|
需要每个页面产生一个应用程序集
|
|
√
|
WEB
页面或者
WEB
用户控件中需要使用到单独的类。
|
√
|
|
需要使用多个
Project
来构建一个
Web
应用。
|
√
|
|
需要处理
pre-build
和
post-build
事件(编译前后需要有自己额外的处理)
|
√
|
|
希望把一个目录当作一个
WEB
应用来处理,而不需要新建一个
Project
文件。
|
|
√
|
优先选择 Web 应用程序项目的情况包括:
需要在不停止调试会话的情况下能够编辑代码。
需要对与 ASP.NET 页关联的类文件中的代码运行单元测试。
需要从独立类中引用与页和用户控件关联的类。
您希望在多个 Web 项目之间建立项目相关性。
您希望编译器为整个站点创建单个程序集。
您要控制为站点生成的程序集的名称和版本号。
需要使用 MSBuild 或 Team Build 编译项目。 例如,您可能希望添加预先生成和后期生成步骤。
需要避免将源代码放置在生产服务器上。
需要使用 Visual Studio 2010 中提供的自动化部署工具。
优先选择网站项目的情况包括:
需要在单个 Web 项目中同时包含 C# 和 Visual Basic 代码。 (默认情况下,是根据项目文件中的语言设置编译 Web 应用程序的。 可以设置例外情况,但相对较难。)
需要在 Visual Studio 中打开生产站点和使用 FTP 对其进行实时更新。
不希望必须显式编译项目才能部署项目。
如果预编译站点,您希望编译器为站点创建多个程序集,可以是每个页面或用户控件一个程序集,也可以是每个文件夹一个或多个程序集。
您希望能够通过仅将新版本复制到生产服务器,或通过在生产服务器上直接编辑文件来更新生产中的各个文件。
如果预编译站点,您希望能更新各 ASP.NET 网页(.aspx 文件),而无需重新编译整个网站。
您希望在生产服务器上保留源代码,以便用作附加备份副本。
下表总结了主要差异。
区域
Web 应用程序项目
网站项目
项目文件结构
Visual Studio 项目文件(.csproj 或 .vbproj)存储有关项目的信息,如项目中包含的文件列表和项目间的任何引用。
不存在项目文件(.csproj 或 .vbproj)。 文件夹结构中的所有文件自动包含在站点中。
编译
在用于开发或源代码控制的计算机上显式编译源代码。
默认情况下,编译代码文件(不包括 .aspx 和 .ascx 文件)会生成一个程序集。
源代码通常是在站点安装或更新后首次收到请求时在服务器上通过 ASP.NET 动态(自动)进行编译的。
可以预编译站点(在开发计算机或服务器上预先编译)。
默认情况下,编译会生成多个程序集。
命名空间
默认情况下,将显式命名空间添加到页面、控件和类中。
默认情况下,不将显式命名空间添加到页面、控件和类中,但您可以手动添加它们。
部署
将程序集复制到服务器。 程序集通过编译应用程序生成。
Visual Studio 提供多个与 IIS Web 部署工具集成的工具来自动执行许多部署任务。
您将应用程序源文件复制到已安装 IIS 的计算机上。
如果在开发计算机上预编译站点,您可以将通过编译产生的程序集复制到 IIS 服务器。
Visual Studio 提供了多个用于部署的工具,但是这些工具自动执行的部署任务的数量不如为 Web 应用程序项目提供的工具多。
项目文件结构
Web 应用程序项目使用 Visual Studio 项目文件(.csproj 或 .vbproj)来跟踪有关项目的信息。 除其他任务以外,这还使得指定项目中要包含或排除哪些文件,以及因此在生成期间编译哪些文件成为可能。
对于网站项目,文件夹结构中的所有文件会被自动视为包含在网站中。 如果您希望从编译中排除某些文件,必须从网站项目文件夹中移除文件或将其文件扩展名更改为不由 IIS 编译和提供的扩展名。
使用 Web 应用程序项目中的项目文件具有以下优点:
易于暂时从站点移除文件,但仍确保不会失去对它们的跟踪,因为这些文件保留在文件夹结构中。 例如,如果页面没有为部署准备就绪,您可以暂时从生成中排除它,而无需从文件夹结构中将其删除。 您可以部署编译的程序集,然后再次将文件包括在项目中。 这在使用源代码管理储存库时尤为重要。
在网站项目中使用无项目文件的文件夹结构具有以下优点:
您不必专门在 Visual Studio 中管理项目的结构。 例如,您可以通过使用 Windows 资源管理器将文件复制到项目中或从项目中删除文件。
编译
对于 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 应用程序项目以自动执行其中许多任务的工具,如一键式发布。 这些工具对于网站项目不可用。
网站项目部署策略的优点包括:
如果对 Web 应用程序进行少量更改,则不必重新部署整个应用程序。 而是可以只将更改过的文件复制到生产 IIS 服务器。 另外,还可在生产服务器上直接编辑文件。 (因为 Web 应用程序项目的代码文件将被编译成单个程序集文件,所以即使进行少量更改,也必须部署整个站点,除非更改只是针对 .aspx 或 .ascx 文件。)