ASP.NET 提供了两种用于预编译网站的模型。本主题讨论这两种预编译模型,并提供有关为 Web 应用程序选择适当模型的指南。
决策矩阵
使用下表来帮助您决定要使用哪种编译模型。本文档后面将对每种编译模型进行更详细的说明。
如果希望 | 使用此编译模型 |
---|---|
快速开发应用程序而不考虑代码的编译。 | 使用默认编译。 |
缩短对网站的首次页请求的响应时间。 | 使用就地编译或部署编译选项之一。 |
分离源代码和用户界面 (UI) 代码。 | 使用可更新 UI 的编译。 |
在不更改源代码的情况下修改 UI 代码。 | 使用可更新 UI 的编译。 |
从成品服务器移除所有源代码和 UI 代码。 | 使用不可更新 UI 的编译。 |
通过替换特定程序集来更新应用程序。 | 使用固定名称的编译。 |
使用具有强名称的程序集提高应用程序的安全性。 | 使用签名的程序集编译。 |
默认编译
无需对 ASP.NET 应用程序执行任何手动编译。默认情况下,ASP.NET 运行库在 Web 浏览器首次请求应用程序中的页时编译 Web 应用程序。如果对应用程序中的文件进行了更改,则在下次请求页时,ASP.NET 运行库将确定已更改的文件的依赖项,并且仅重新编译受更改影响的文件。
优点
使用默认编译的优点包括:
-
简单易用。ASP.NET 编译器会为您完成所有工作。
-
当预编译网站所需的额外步骤减慢了开发过程时,默认编译是开发过程中可供选择的最佳编译模型。
缺点
使用默认编译的缺点包括:
-
在首次请求网站时可能会导致大量延迟。
-
要求将源代码文件存储在成品服务器上。
-
对服务器上的网站目录拥有文件系统访问权限的任何人都可以获取源代码和 UI 代码。
何时使用默认编译
在下列情况下使用默认编译:
-
在开发和测试网站时。
-
用于主要包含静态信息的网站。
-
用于不经常更改的网站。
就地编译
可以使用 ASP.NET 编译工具 (Aspnet_compiler.exe) 预编译 Web 应用程序。该编译工具调用 ASP.NET 运行库来编译网站,其方式与用户向网站请求页时的方式相同。
如果对应用程序中的文件进行了更改,可以使用 ASP.NET 编译工具重新编译受影响的文件,也可以在下次向应用程序请求页时重新编译受影响的文件。
有关此编译模型的更多信息,请参见如何:预编译 ASP.NET 网站。
优点
使用就地编译的优点包括:
-
缩短了网站对首次请求的响应时间。
-
无需特殊的部署步骤;编译应用程序的过程完全就像从站点请求页一样。
缺点
使用就地编译的缺点包括:
-
应用程序的所有源代码必须存储在成品服务器上。
-
对网站目录拥有访问权限的任何人都可以获取源代码和 UI 代码。
何时使用就地编译
在下列情况下使用就地编译:
-
经常对网站上的页进行更改。
-
将源代码文件存储在成品服务器上不存在顾虑。
-
想要缩短首次页请求的响应时间。
可更新 UI 的预编译
通过使用 ASP.NET 编译工具的 -u 开关,可以将源代码(.cs 和/或 .vb 文件以及 .resource 文件)编译为 DLL 并保留 .aspx 文件中的 UI 标记以供更新。
在将网站部署到成品服务器后,无需重新编译整个网站即可对 .aspx 代码进行更改。
有关此编译方法的更多信息,请参见如何:预编译 ASP.NET 网站以进行部署。
优点
可更新 UI 的网站预编译的优点包括:
-
缩短了网站对首次请求的响应时间。
-
用户界面开发人员无需重新编译整个网站即可修改网站的外观和行为。
-
保护应用程序源代码中包含的知识产权,以防止被对网站目录拥有文件系统访问权限的任何人意外看到。
缺点
可更新 UI 的网站预编译的缺点包括:
-
在部署到成品服务器之前,需要执行单独的编译步骤。
-
对网站目录拥有访问权限的任何人都可以获取应用程序 UI 代码(.aspx 文件)中包含的知识产权。
-
多个页不能引用同一 CodeFile 类。
何时使用可更新 UI 的预编译
在下列情况下进行可更新 UI 的应用程序预编译:
-
UI 设计人员与源代码开发人员独立工作。
-
源代码包含要加以保护以防被意外看到的知识产权。
-
不想将源代码存储在成品服务器上。
不可更新 UI 的预编译
ASP.NET 编译工具可将应用程序的所有源代码(包括 UI 文件,如 .aspx 和 .ascx 文件)编译为部署在应用程序的 Bin 目录中的 DLL。
有关此编译方法的更多信息,请参见如何:预编译 ASP.NET 网站以进行部署。
优点
不可更新 UI 的预编译的优点包括:
-
缩短了网站对首次请求的响应时间。
-
保护应用程序源代码和 UI 代码中包含的知识产权,以防止被对网站目录拥有访问权限的任何人意外看到。
缺点
不可更新 UI 的预编译的缺点包括:
-
在部署到成品服务器之前,需要执行单独的编译步骤。
-
对应用程序 UI 进行很小的改动就需要重新编译整个网站。
何时使用不可更新 UI 的预编译
在下列情况下使用不更新 UI 的网站预编译:
-
UI 代码中包含要加以保护以防被意外看到的知识产权。
-
只希望将已编译的 DLL 放在成品服务器。
预编译为固定名称的程序集
ASP.NET 编译工具对编译期间生成的程序集使用随机名称。每次重新编译应用程序,程序集的名称就会更改。
由于程序集名称会更改,因此为维护一个程序集就必须重新部署整个应用程序。通过使用 ASP.NET 编译工具的 -fixednames 开关,可以为应用程序中的每个页分别创建一个程序集。程序集的名称在后续编译时不会更改,因此可以创建只替换已更改的程序集的应用程序 Service Release。
由于使用 -fixednames 开关将为每个页创建一个单独的程序集,因此应限制应用程序中的页数。
有关此预编译方法的更多信息,请参见如何:使用 ASP.NET 编译工具生成固定名称。
优点
预编译为固定名称的程序集的优点包括:
-
每个程序集的名称不会随着多次编译而更改,因而无需重新部署整个应用程序即可以替换特定的程序集。
-
对应用程序的次要更新可能更具有针对性。
缺点
预编译为固定名称的程序集的缺点包括:
-
需要分别为应用程序中的每个页创建一个程序集。这可能会为包含许多页的站点创建大量程序集。
何时预编译为固定名称的程序集
在下列情况下将网站预编译为固定名称的程序集:
-
需要在不替换整个应用程序的情况下维护 Web 应用程序。
预编译为签名的程序集
可以使用 ASP.NET 编译工具创建可部署到服务器的全局程序集缓存 (GAC) 或应用程序的 Bin 目录中的具有强名称的程序集。使用签名的程序集使得恶意用户更难用恶意代码替换应用程序的程序集。
有关此编译方法的更多信息,请参见如何:为预编译网站的程序集签名。
优点
预编译为签名的程序集的优点包括:
-
通过使程序集更难被恶意代码替换,签名的程序集提高了应用程序的安全性。
缺点
预编译为签名的程序集的缺点包括:
-
共享开发环境中的密钥管理可能很复杂。
-
程序集必须让 ASP.NET 运行库调用 AllowPartiallyTrustedCallersAttribute 属性。
何时预编译为签名的程序集
在下列情况下将网站预编译为签名的程序集:
-
用户有权访问应用程序目录或 GAC,并且能够替换应用程序的程序集。
-
希望限制第三方替换代码所生成的程序集的能力。