分享

ASP.NET网站的预编译和编译

 悟静 2011-04-24

14.3  ASP.NET网站的预编译和编译

ASP.NET在将整个站点提供给用户之前,可以预编译该站点。这为用户提供了更快的响应时间,提供了在向用户显示站点之前标识编译时bug的方法,提供了避免部署源代码的方法,并提供了有效的将站点部署到成品服务器的方法。可以在网站的当前位置预编译网站,也可以预编译网站并将其部署到其他计算机。

在正式部署网站前,ASP.NET还要将代码编译成一个或多个程序集。

14.3.1  ASP.NET网站的预编译

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

ASP.NET还可以预编译整个站点,然后再提供给用户使用。这样做有很多好处:

— 可以加快用户的响应时间,因为页和代码文件在第一次被请求时无须编译。这对于经常更新的大型站点尤其有用。

— 可以在用户看到站点之前识别编译时bug。

— 可以创建站点的已编译版本,并将该版本部署到成品服务器,而无须使用源代码。

ASP.NET提供了两个预编译站点选项。

(1)预编译现有站点。

如果希望提高现有站点的性能并对站点执行错误检查,那么此选项十分有用。可以通过预编译网站来稍稍提高网站的性能。对于经常更改和补充ASP.NET网页及代码文件的站点则更是如此。在这种内容不固定的网站中,动态编译新增页和更改页所需的额外时间会影响用户对站点质量的感受。在执行就地预编译时,将编译所有的ASP.NET文件类型(HTML文件、图形和其他非ASP.NET静态文件将保持原状)。预编译过程的逻辑与ASP.NET进行动态编译时所用的逻辑相同,这说明了文件之间的依赖关系。在预编译过程中,编译器将为所有可执行输出创建程序集,并将程序集放在%SystemRoot%\Microsoft. NET\Framework\version\Temporary ASP.NET Files文件夹下的特殊文件夹中。随后,ASP.NET将通过此文件夹中的程序集来完成页请求。如果再次预编译站点,那么将只编译新文件或更改过的文件(或那些与新文件或更改过的文件具有依赖关系的文件)。编译器的这一优化,用户即使是在细微的更新之后,也可以编译站点。

(2)针对部署预编译站点。

此选项将创建一个特殊的输出,可以将该输出部署到成品服务器。预编译站点的另一个用处是生成可部署到成品服务器的站点的可执行版本。针对部署进行预编译将以布局形式创建输出,其中包含程序集、配置信息、有关站点文件夹的信息,以及静态文件(如 HTML 文件和图形)。

编译站点之后,可以使用 Windows XCopy 命令、FTP、Windows 安装等工具将布局部署到成品服务器。布局在部署完之后将作为站点运行,且 ASP.NET 将通过布局中的程序集来完成页请求。

针对部署预编译又可以按照以下两种方式来针对部署进行预编译:仅针对部署进行预编译,或者针对部署和更新进行预编译。

— 仅针对部署进行预编译。

当仅针对部署进行预编译时,编译器实质上将基于正常情况下在运行时编译的所有ASP.NET源文件来生成程序集。其中包括页中的程序代码、.cs和.vb类文件,以及其他代码文件和资源文件。编译器将从输出中移除所有源代码和标记。在生成的布局中,为每个.aspx文件生成编译后的文件(扩展名为.compiled),该文件包含指向该页相应程序集的指针。

要更改网站(包括页的布局),必须更改原始文件,重新编译站点并重新部署布局。唯一的例外是站点配置,可以更改成品服务器上的 Web.config 文件,而无须重新编译站点。此选项不仅为页提供了最大程度的保护,还提供了最佳启动性能。

针对部署和更新进行预编译

当针对部署和更新进行预编译时,编译器将基于所有源代码(单文件页中的页代码除外)及正常情况下用来生成程序集的其他文件(如资源文件)来生成程序集。编译器将.aspx文件转换成使用编译后的代码隐藏模型的单个文件,并将它们复制到布局中。

使用此选项,可以在编译站点中的ASP.NET网页之后对它们进行有限的更改。例如,可以更改控件的排列、页的颜色、字体和其他外观元素。还可以添加不需要事件处理程序或其他代码的控件。

预编译过程对ASP.NET Web应用程序中各种类型的文件执行操作。文件的处理方式各不相同,这取决于应用程序预编译只是用于部署还是用于部署和更新。表14-16描述了不同的文件类型,以及应用程序预编译只是用于部署时对这些文件类型所执行的操作。

表14-16  部署时不同文件类型对应的预编译操作和输出位置

文件类型

预编译操作

输出位置

.aspxascx.master

生成程序集和一个指向该程序集的.compiled文件。原始文件保留在原位置,作为完成请求的占位符

程序集和.compiled文件写入Bin文件夹中。页(去除内容的.aspx文件)保留在其原始位置

.asmx.ashx

生成程序集。原始文件保留在原位置,作为完成请求的占位符

Bin文件夹

App_Code文件夹中的文件

生成一个或多个程序集(取决于Web.config设置)

Bin文件夹

未包含在App_Code文件夹中的.cs.vb文件

与依赖于这些文件的页或资源一起编译

Bin文件夹

Bin文件夹中的现有.dll文件

按原样复制文件

Bin文件夹

资源(.resx)文件

对于App_LocalResourcesApp_GlobalResources文件夹中找到的.resx文件,生成一个或多个程序集以及一个区域性结构

Bin文件夹

App_Themes文件夹及子文件夹中的文件

在目标位置生成程序集并生成指向这些程序集的.compiled文件

Bin文件夹

静态文件(.htm.html、图形文件等)

按原样复制文件

与源中结构相同

浏览器定义文件

按原样复制文件

App_Browsers

依赖项目

将依赖项目的输出生成到程序集中

Bin文件夹

Web.config文件

按原样复制文件

与源中结构相同

Global.asax文件

编译到程序集中

Bin文件夹

表14-17描述了不同的文件类型,以及应用程序预编译用于部署和更新时对这些文件类型所执行的操作。

表14-17  部署和更新时不同文件类型对应的预编译操作和输出位置

文件类型

预编译操作

输出位置

.aspxascx.master

对于具有代码隐藏类文件的文件,生成程序集和一个指向该程序集的.compiled文件。将这些文件的单文件版本原封不动地复制到目标位置

程序集和.compiled文件写入Bin文件夹中

.asmx.ashx

按原样复制文件,但不编译

与源中结构相同

App_Code文件夹中的文件

生成一个或多个程序集(取决于Web.config设置)

Bin文件夹

未包含在App_Code文件夹中的.cs.vb文件

与依赖于这些文件的页或资源一起编译

Bin文件夹

续表 

文件类型

预编译操作

输出位置

Bin文件夹中的现有.dll文件

按原样复制文件

Bin文件夹

资源(.resx)文件

对于App_GlobalResources文件夹中的.resx文件,生成一个或多个程序集,以及一个区域性结构

对于App_LocalResources文件夹中的.resx文件,将它们按原样复制到输出位置的App_LocalResources文件夹中

程序集放置在Bin文件夹中

App_Themes文件夹及子文件夹中的文件

按原样复制文件

与源中结构相同

静态文件(.htm.html、图形文件等)

按原样复制文件

与源中结构相同

浏览器定义文件

按原样复制文件

App_Browsers

依赖项目

将依赖项目的输出生成到程序集中

Bin文件夹

Web.config文件

文件被复制

与源中结构相同

Global.asax文件

编译到程序集中

Bin文件夹

在部署预编译的网站之后,可以对站点中的文件进行一定更改。表14-18描述了不同类型的更改所造成的影响。

表14-18  对文件进行更改后对网站的影响

文件类型

允许的更改(仅部署)

允许的更改(部署和更新)

静态文件(.htm.html图形文件等)

可以更改、移除或添加静态文件。如果ASP.NET网页引用的页或页元素已被更改或移除,可能会发生错误

可以更改、移除或添加静态文件。如果ASP.NET网页引用的页或页元素已被更改或移除,可能会发生错误

.aspx文件

不允许更改现有的页。不允许添加新的.aspx文件

可以更改 .aspx 文件的布局和添加不需要代码的元素,例如,HTML元素和不带有事件处理程序的ASP.NET服务器控件。还可以添加新的.aspx文件,该文件通常在首次请求时进行编译

.skin文件

忽略更改和新增的.skin文件

允许更改和新增的.skin文件

Web.config文件

允许更改,这些更改将影响.aspx文件的编译。忽略调试或批处理编译选项。

不允许更改配置文件属性或提供程序元素

如果所做的更改不会影响站点或页的编译(包括编译器设置、信任级别和全球化),则允许进行更改。忽略影响编译或使已编译页中的行为发生变化的更改,否则在一些实例中可能会生成错误。允许其他更改

浏览器定义

允许更改和新增文件

允许更改和新增文件

从资源(.resx)文件编译的程序集

可以为全局和局部资源添加新的资源程序集文件

可以为全局和局部资源添加新的资源程序集文件

对于ASP.NET Web应用程序中的可执行文件,编译器程序集,以及文件扩展名为.compiled的文件。程序集名称由编译器生成。.compiled文件不包含可执行代码。它只包含ASP.NET查找相应的程序集所需的信息。

在部署预编译的应用程序之后,ASP.NET使用Bin文件夹中的程序集来处理请求。预编译输出包含.aspx或.asmx文件作为页占位符。占位符文件不包含任何代码。使用它们只是为了提供一种针对特定页请求调用ASP.NET的方式,以便可以设置文件权限来限制对页的访问。

14.3.2  ASP.NET网站的编译

为了使用应用程序代码为用户提出的请求提供服务,ASP.NET必须首先将代码编译成一个或多个程序集。程序集是文件扩展名为.dll的文件。可以采用多种不同的语言来编写ASP.NET代码,如Visual Basic、C#、J#和其他语言。当在编译代码时,会将代码翻译成一种名为Microsoft中间语言(MSIL)的与语言和CPU无关的表示形式。运行时,MSIL将运行在.NET Framework的上下文中,.NET Framework会将MSIL翻译成CPU特定的指令,以便计算机上的处理器运行应用程序。

编译应用程序代码具有许多好处,其中包括:

— 性能。编译后的代码的执行速度要比诸如ECMAScript或VBScript的脚本语言快得多,因为它是一种更接近于机器代码的表示形式,并且不需要进行其他分析。

— 安全性。编译后的代码要比非编译的源代码更难进行反向工程处理,因为编译后的代码缺乏高级别语言所具有的可读性和抽象性。此外,模糊处理工具增强了编译后的代码对抗反向工程处理的能力。

— 稳定性。在编译时检查代码是否有语法错误、类型安全问题,以及其他问题。通过在生成时捕获这些错误,可以消除代码中的许多错误。

— 互操作性。由于MSIL代码支持任何.NET语言,因此可以在代码中使用最初用其他语言编写的程序集。例如,如果正在用C#编写ASP.NET网页,可以添加对使用Visual Basic编写的.dll文件的引用。

ASP.NET编译结构包括许多功能,其中包括:

— 多语言支持;

— 自动编译;

— 灵活部署;

— 可扩展生成系统。

(1)多语言支持。

在ASP.NET 2.0中,可以在同一个应用程序中使用不同的语言(如Visual Basic和C#),这是因为ASP.NET将为每一种语言分别创建一个程序集。对于存储在App_Code文件夹中的代码,可以为每种语言指定一个子文件夹。

(2)自动编译。

当用户首次请求网站的资源时,ASP.NET将自动编译应用程序代码和任何依赖资源。通常,ASP.NET为每个应用程序目录(如App_Code)创建一个程序集,并为主目录创建一个程序集(如果一个目录中的文件是用不同编程语言编写的,将为每种语言分别创建程序集),可以在Web.config文件的Compilation节指定将哪些目录编译成单个程序集。

(3)灵活部署。

因为ASP.NET在首次用户请求时编译网站,所以只需要将应用程序源代码复制到成品Web服务器上即可。不过,ASP.NET还提供了预编译选项,通过这些选项,可以在部署网站之前先进行编译,或者在部署网站之后、用户请求该网站之前进行编译。预编译有若干优点。由于ASP.NET编译网站时不存在延迟时间,因而预编译可以改进首次请求时网站的性能。预编译还能帮用户找到不然只有当用户请求页时才能找到的错误。最后,如果在部署网站之前预编译网站,则可以部署程序集,而不必部署源代码。

可以使用ASP.NET编译器工具(ASPNET_Compiler.exe)预编译网站。该工具提供下列预编译选项:

— 就地编译。此选项执行与动态编译期间发生的相同编译过程。可以使用此选项编译已经部署到成品服务器的网站。

— 不可更新完全预编译。可以使用此选项来编译应用程序,然后将编译后的输出复制到成品服务器。所有应用程序代码、标记和用户界面代码都将编译为程序集。占位符文件(如.aspx页)仍存在,因此可以执行某些文件特定的任务(如设置权限),但文件中不包含可更新的代码。为了更新任何页或任何代码,必须再次预编译并再次部署网站。

— 可更新的预编译。该选项类似于“不可更新完全预编译”,不同之处在于用户界面元素(如.aspx页和.ascx控件)保留其所有标记、用户界面代码和内联代码(如果有的话)。可以在部署之后更新文件中的代码;ASP.NET将检测对文件所做的这些更改并重新进行编译。请注意,预编译期间代码隐藏文件(.vb或.cs文件)中的代码都将内置到程序集中,因此如果不重新执行预编译和部署步骤,将无法更改这些代码。

(4)可扩展生成系统。

ASP.NET使用BuildProvider类来生成项,如.aspx页、.ascx文件和全局资源。可以通过创建从BuildProvider类继承的类来扩展和自定义ASP.NET生成系统,以编译自定义资源。例如,可以添加新的文件类型,然后编写生成该特定类型的BuildProvider。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多