ASP.NET 网站预编译概述
2007-08-22 01:14 Valens 阅读(440) 评论(0) 编辑 收藏 举报默认情况下,在用户首次请求资源(如网站的一个页)时,将动态编译 ASP.NET 网页和代码文件。第一次编译页和代码文件之后,会缓存编译后的资源,这样将大大提高随后对同一页提出的请求的效率。
ASP.NET 还可以预编译整个站点,然后再提供给用户使用。这样做有很多好处,其中包括:
-
可以加快用户的响应时间,因为页和代码文件在第一次被请求时无需编译。这对于经常更新的大型站点尤其有用。
-
可以在用户看到站点之前识别编译时 Bug。
-
可以创建站点的已编译版本,并将该版本部署到成品服务器,而无需使用源代码。
预编译选项
ASP.NET 提供了两个预编译站点选项:
-
预编译现有站点。如果您希望提高现有站点的性能并对站点执行错误检查,那么此选项十分有用。
-
针对部署预编译站点。此选项将创建一个特殊的输出,您可以将该输出部署到成品服务器。
另外,可以预编译一个站点,使它成为只读的或可以更新的站点。以下部分提供了有关每个选项的更多详细信息。
就地预编译
您可以通过预编译网站来稍稍提高网站的性能。对于经常更改和补充 ASP.NET 网页及代码文件的站点则更是如此。在这种内容不固定的网站中,动态编译新增页和更改页所需的额外时间会影响用户对站点质量的感受。
![]() |
---|
预编译现有站点可以高效地执行当用户从您的站点请求页时发生的同样编译过程。因此,主要的性能改进在于在第一次请求页时无需对该页进行编译。 |
在执行就地预编译时,将编译所有 ASP.NET 文件类型。(HTML 文件、图形和其他非 ASP.NET 静态文件将保持原状。)预编译过程的逻辑与 ASP.NET 进行动态编译时所用的逻辑相同,说明了文件之间的依赖关系。在预编译过程中,编译器为所有可执行输出创建程序集,并将这些程序集放在 %SystemRoot%\Microsoft.NET\Framework\版本\Temporary ASP.NET Files 文件夹下的特殊文件夹中。随后,ASP.NET 将通过此文件夹中的程序集来完成页请求。
如果再次预编译站点,那么将只编译新文件或更改过的文件(或那些与新文件或更改过的文件具有依赖关系的文件)。由于编译器的这一优化,因此,即使是在细微的更新之后也可以编译站点。
针对部署的预编译
预编译站点的另一个用处是生成可部署到成品服务器的站点的可执行版本。针对部署进行预编译将以布局形式创建输出,其中包含程序集、配置信息、有关站点文件夹的信息以及静态文件(如 HTML 文件和图形)。
编译站点之后,可以使用 Windows XCopy 命令、FTP、Windows 安装等工具将布局部署到成品服务器。布局在部署完之后将作为站点运行,且 ASP.NET 将通过布局中的程序集来完成页请求。
针对部署预编译站点为您的源代码和其他知识产权提供了保护措施。有关编译器在针对部署的编译过程中如何处理文件的更多信息,请参见针对部署的站点编译过程中的文件处理。
您可以按照以下两种方式来针对部署进行预编译:仅针对部署进行预编译,或者针对部署和更新进行预编译。
仅针对部署进行预编译
当仅针对部署进行预编译时,编译器实质上将基于正常情况下在运行时编译的所有 ASP.NET 源文件来生成程序集。其中包括页中的程序代码、.cs 和 .vb 类文件以及其他代码文件和资源文件。编译器将从输出中移除所有源代码和标记。在生成的布局中,为每个 .aspx 文件生成编译后的文件(扩展名为 .compiled),该文件包含指向该页相应程序集的指针。
要更改网站(包括页的布局),必须更改原始文件,重新编译站点并重新部署布局。唯一的例外是站点配置;您可以更改成品服务器上的 Web.config 文件,而无需重新编译站点。
此选项不仅为您的页提供了最大程度的保护,还提供了最佳启动性能。
针对部署和更新进行预编译
当针对部署和更新进行预编译时,编译器将基于所有源代码(单文件页中的页代码除外)以及正常情况下用来生成程序集的其他文件(如资源文件)来生成程序集。编译器将 .aspx 文件转换成使用编译后的代码隐藏模型的单个文件,并将它们复制到布局中。
使用此选项,可以在编译站点中的 ASP.NET 网页之后,对它们进行有限的更改。例如,可以更改控件的排列、页的颜色、字体和其他外观元素。您还可以添加不需要事件处理程序或其他代码的控件。
当站点第一次运行时,为了从标记创建输出,ASP.NET 将执行进一步的编译。
![]() |
---|
预编译的可更新网站不允许多个页引用相同的 CodeFile 类。 |
预编译子应用程序
预编译网站只是对该站点进行编译,而不会编译所有子站点。如果网站包含在 IIS 中标记为应用程序的子文件夹,则当预编译父文件夹时,不会编译子应用程序。
执行预编译
可以在命令行上使用 Aspnet_compiler.exe 工具预编译网站。有关更多信息,请参见如何:预编译 ASP.NET 网站以进行部署和 ASP.NET 编译工具 (Aspnet_compiler.exe)。
某些可视化设计器(如 Visual Studio)包括从 IDE 内预编译网站的命令。 有关更多信息,请参见 如何:为预编译网站发布和签名程序集 和 如何:发布和生成固定程序集名称 和 如何:发布网站 (Visual Studio).
有一条编码限制适用于您打算编译的、启用了源保护的网站。基页类(代码隐藏类)可以使用完全限定类名来引用相关联的页类(.aspx 文件)和页类成员。不过,在预编译启用了源保护的网站时,此种引用不起作用。这是因为代码隐藏文件中的基页类与 .aspx 页派生的页类不在相同的程序集中。有关启用了源保护的预编译的更多信息,请参见如何:为预编译网站的程序集签名。
请参见
预编译选项
ASP.NET 提供了两个预编译站点选项:
-
预编译现有站点。如果您希望提高现有站点的性能并对站点执行错误检查,那么此选项十分有用。
-
针对部署预编译站点。此选项将创建一个特殊的输出,您可以将该输出部署到成品服务器。
另外,可以预编译一个站点,使它成为只读的或可以更新的站点。以下部分提供了有关每个选项的更多详细信息。
就地预编译
您可以通过预编译网站来稍稍提高网站的性能。对于经常更改和补充 ASP.NET 网页及代码文件的站点则更是如此。在这种内容不固定的网站中,动态编译新增页和更改页所需的额外时间会影响用户对站点质量的感受。
![]() |
---|
预编译现有站点可以高效地执行当用户从您的站点请求页时发生的同样编译过程。因此,主要的性能改进在于在第一次请求页时无需对该页进行编译。 |
在执行就地预编译时,将编译所有 ASP.NET 文件类型。(HTML 文件、图形和其他非 ASP.NET 静态文件将保持原状。)预编译过程的逻辑与 ASP.NET 进行动态编译时所用的逻辑相同,说明了文件之间的依赖关系。在预编译过程中,编译器为所有可执行输出创建程序集,并将这些程序集放在 %SystemRoot%\Microsoft.NET\Framework\版本\Temporary ASP.NET Files 文件夹下的特殊文件夹中。随后,ASP.NET 将通过此文件夹中的程序集来完成页请求。
如果再次预编译站点,那么将只编译新文件或更改过的文件(或那些与新文件或更改过的文件具有依赖关系的文件)。由于编译器的这一优化,因此,即使是在细微的更新之后也可以编译站点。
针对部署的预编译
预编译站点的另一个用处是生成可部署到成品服务器的站点的可执行版本。针对部署进行预编译将以布局形式创建输出,其中包含程序集、配置信息、有关站点文件夹的信息以及静态文件(如 HTML 文件和图形)。
编译站点之后,可以使用 Windows XCopy 命令、FTP、Windows 安装等工具将布局部署到成品服务器。布局在部署完之后将作为站点运行,且 ASP.NET 将通过布局中的程序集来完成页请求。
针对部署预编译站点为您的源代码和其他知识产权提供了保护措施。有关编译器在针对部署的编译过程中如何处理文件的更多信息,请参见针对部署的站点编译过程中的文件处理。
您可以按照以下两种方式来针对部署进行预编译:仅针对部署进行预编译,或者针对部署和更新进行预编译。
仅针对部署进行预编译
当仅针对部署进行预编译时,编译器实质上将基于正常情况下在运行时编译的所有 ASP.NET 源文件来生成程序集。其中包括页中的程序代码、.cs 和 .vb 类文件以及其他代码文件和资源文件。编译器将从输出中移除所有源代码和标记。在生成的布局中,为每个 .aspx 文件生成编译后的文件(扩展名为 .compiled),该文件包含指向该页相应程序集的指针。
要更改网站(包括页的布局),必须更改原始文件,重新编译站点并重新部署布局。唯一的例外是站点配置;您可以更改成品服务器上的 Web.config 文件,而无需重新编译站点。
此选项不仅为您的页提供了最大程度的保护,还提供了最佳启动性能。
针对部署和更新进行预编译
当针对部署和更新进行预编译时,编译器将基于所有源代码(单文件页中的页代码除外)以及正常情况下用来生成程序集的其他文件(如资源文件)来生成程序集。编译器将 .aspx 文件转换成使用编译后的代码隐藏模型的单个文件,并将它们复制到布局中。
使用此选项,可以在编译站点中的 ASP.NET 网页之后,对它们进行有限的更改。例如,可以更改控件的排列、页的颜色、字体和其他外观元素。您还可以添加不需要事件处理程序或其他代码的控件。
当站点第一次运行时,为了从标记创建输出,ASP.NET 将执行进一步的编译。
![]() |
---|
预编译的可更新网站不允许多个页引用相同的 CodeFile 类。 |
预编译子应用程序
预编译网站只是对该站点进行编译,而不会编译所有子站点。如果网站包含在 IIS 中标记为应用程序的子文件夹,则当预编译父文件夹时,不会编译子应用程序。
执行预编译
可以在命令行上使用 Aspnet_compiler.exe 工具预编译网站。有关更多信息,请参见如何:预编译 ASP.NET 网站以进行部署和 ASP.NET 编译工具 (Aspnet_compiler.exe)。
某些可视化设计器(如 Visual Studio)包括从 IDE 内预编译网站的命令。 有关更多信息,请参见 如何:为预编译网站发布和签名程序集 和 如何:发布和生成固定程序集名称 和 如何:发布网站 (Visual Studio).
有一条编码限制适用于您打算编译的、启用了源保护的网站。基页类(代码隐藏类)可以使用完全限定类名来引用相关联的页类(.aspx 文件)和页类成员。不过,在预编译启用了源保护的网站时,此种引用不起作用。这是因为代码隐藏文件中的基页类与 .aspx 页派生的页类不在相同的程序集中。有关启用了源保护的预编译的更多信息,请参见如何:为预编译网站的程序集签名。