了解 ASP.NET 动态编译

更新:2007 年 11 月

为了使 Web 应用程序为请求提供服务,ASP.NET 必须首先分析 Web 应用程序的代码并将代码编译成一个或多个程序集。当编译代码时,会将代码翻译成一种名为 Microsoft 中间语言 (MSIL) 的与语言和 CPU 无关的表示形式。运行时,MSIL 将运行在 .NET Framework 的上下文中,.NET Framework 会将 MSIL 翻译成 CPU 特定的指令,以便计算机上的处理器运行应用程序。

在首次请求时编译

默认情况下,当用户首次请求资源(如网站的一个 ASP.NET 页(.aspx 文件))时,将动态编译 ASP.NET 网页和代码文件。第一次编译页和代码文件之后,会缓存编译后的资源,这样将大大提高随后对同一页提出的请求的效率。

ASP.NET 支持动态编译 ASP.NET 页(.aspx 文件)、ASP.NET Web 服务(.asmx 文件)、ASP.NET HTTP 处理程序(.ashx 文件)和 ASP.NET 应用程序文件 (Global.asax) 以及其他文件,例如源代码和类文件。有关 ASP.NET 文件类型的更多信息,请参见网站文件类型。有关 ASP.NET 编译进程的更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述的“编译生命周期”一节。

更改时重新编译

对动态编译文件的任何更改都会自动使文件的缓存编译程序集无效,并触发所有受影响的资源的重新编译。下次向代码发出请求时,ASP.NET 会识别该代码是否已更改,并重新编译 Web 应用程序的受影响的资源。此系统使您能够用最少的编译处理开销快速开发应用程序。(请注意,根据对资源进行的更改,结果的范围可能从重新编译单个页面到重新编译整个网站。)

编译依赖项

在第一次对应用程序发出请求时,ASP.NET 按特定顺序编译文件。要编译的第一批项称为顶级项。在第一次请求之后,仅当依赖项更改时才会重新编译顶级项。

顶级项包括 App_GlobalResources 文件夹、App_WebResources 文件夹、配置文件属性、App_Code 文件夹和 Global.asax 文件。编译顶级项之后,ASP.NET 将编译其他项。这些项包括 App_LocalResources 文件夹、单个 ASP.NET 页(.aspx 文件)、ASP.NET 用户控件(.ascx 文件)、ASP.NET HTTP 处理程序(.ashx 文件)和 ASP.NET HTTP 模块(.asmx 文件),以及主题、母版页和其他源文件。

有关更多信息,请参见 ASP.NET 网站布局IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述的“编译生命周期”一节。

编译输出

编译代码时,生成的程序集缓存在服务器上的文件夹中。此文件夹需要适当的权限,以便代码能够正确编译和运行。您可以配置编译文件夹位置以及代码编译和运行所需的权限。

编译文件夹位置

默认情况下,当您编译 Web 应用程序时,编译的代码放在 Temporary ASP.NET Files 文件夹中。此文件夹是您安装 .NET Framework 的位置的子目录。通常,位置如下:

%SystemRoot%\Microsoft.NET\Framework\versionNumber\Temporary ASP.NET Files

编译文件夹所需的权限

.NET 安装过程创建 Temporary ASP.NET Files 文件夹并为 ASP.NET 本地用户帐户分配访问权限,该帐户具有访问编译的代码所需的高信任权限。如果您修改配置或帐户设置,则必须确保您使用的帐户具有访问 Temporary ASP.NET Files 文件夹的高信任权限。有关其他详细信息,请参见如何:在用户帐户下运行辅助进程

编译文件夹可配置性

ASP.NET 在 Temporary ASP.NET File 文件夹下为每个应用程序创建单独的子文件夹。可以使用配置文件的“编译”一节的 tempDirectory 属性来配置根位置。此可选属性使您能够指定在编译期间用于临时文件存储的目录。默认值为空字符串 ("")。若为空字符串并且当前进程具有所需的访问权限,则文件将存储在以下目录中:

%FrameworkInstallLocation%\Temporary ASP.NET Files

有关更多信息,请参见 compilation 元素(ASP.NET 设置架构)以及 CompilationSectionTempDirectory 属性。

多语言支持

ASP.NET 2.0 支持在同一个 Web 应用程序中使用多种编程语言。在 App_Code 目录中,您可以为每种语言(例如 C# 和 Visual Basic)指定一个子文件夹。ASP.NET 将为每个子文件夹创建一个单独的程序集。有关更多信息,请参见 ASP.NET 网站中的共享代码文件夹演练:使用多种编程语言开发网站

动态编译的优点和缺点

ASP.NET 动态编译使您能够在部署 Web 应用程序之前修改源代码,而不必显式编译代码。如果您修改源文件,则 ASP.NET 会自动重新编译该文件并更新所有链接的资源。除非 <processModel> 一节已更改,否则 IIS 服务器不必重新启动,所做的更改即会生效。此外,还可以通过为新文件类型创建在编译期间调用的自定义生成提供程序,来扩展 ASP.NET 生成系统。ASP.NET 生成系统的动态编译优点还与较旧的 ASP.NET 应用程序结构和类型向后兼容。

动态编译不提供某些功能。动态编译会平均延长用户的初始响应时间,因为页和代码文件必须在首次被请求时编译。尤其对于经常更新的大型站点来说,这可能是一个问题。动态编译不提供在用户访问站点之前识别编译时 Bug 的方法。此外,动态编译不能创建符合以下条件的站点的已编译版本:无需使用源代码即可部署到成品服务器。如果其中任何问题涉及 Web 应用程序,则您可以预编译网站。有关详细信息,请参见 ASP.NET 预编译概述

请参见

任务

如何:保护共享服务器上的 ASP.NET 应用程序的安全

概念

ASP.NET 模拟

ASP.NET 必需的访问控制列表 (ACL)

网站文件类型

ASP.NET 网站布局

参考

CodeGenDir