理解 ASP.NET 预编译

一、预编译的优点

1. 由于页和代码文件在第一次被请求时无需编译,因此可以缩短对用户的响应时间。这对于更新频繁的大型网站尤为有用

2. 可以在用户看到网站之前识别编译时的 Bug

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

二、就地预编译与针对部署的预编译

1. 就地预编译

就地预编译网站可以有效执行用户在请求网页时所发生的编译过程。因此,主要的性能改进在于在第一次请求页时无需对该页进行编译。

编译后的文件存放在%SystemRoot%\Microsoft.NET\Framework\版本\Temporary ASP.NET Files 文件夹下的特殊文件夹中,随后ASP.NET将通过此文件夹中的程序集来完成页请求。

如果再次预编译站点,那么也只编译新文件或更改过的文件(或那些与新文件或更改过的文件具有依赖关系的文件)。

2. 针对部署的预编译

针对部署预编译,编译器将基于正常情况下在运行时编译的几乎所有ASP.NET源文件来生成程序集。编译器将从输出中一处所有的源代码和标记。编译后的文件扩展名为.compiled。

若要更改网站页面的内容,必须更新原始文件、重新编译网站并重新部署。唯一的例外是网站配置文件web.config。

三、下图是Visual Studio 针对部署预编译的配置项

四、高级预编译设置分析

1. 预编译选项>>允许更新预编译站点(不勾选),合并选项>>不合并(勾选)的场景

从图中可以看到,编译后的文件直接出现在bin目录下了,如果你尝试打开Views文件夹下的视图文件,会看到“这是预编译工具生成的标记文件,不应删除!”的提示信息,也表明了,这种预编译方案会导致每次修改视图文件都要重新预编译源文件再发布。

2. 预编译选项>>允许更新预编译站点(不勾选),合并选项>>不合并.为每个页面和空间创建单独的程序集(勾选)的场景

和1场景的差异在于dll文件保留了视图文件名的信息,会比较直观点。

3. 预编译选项>>允许更新预编译站点(不勾选),合并选项>>将所有输出合并到单个程序集,取名为SingleAssmy(勾选)的场景

可以看到所有的dll,都合并到SingleAssmy.dll中了,反编译下看看代码,如图:

此程序集确实包含了所有程序集信息。

4.预编译选项>>允许更新预编译站点(不勾选)

合并选项:将各个文件夹输出合并到其自己的程序集

合并选项:将所有页和控件输出合并到单个程序集

此两项配置没看出有啥区别……

五、个人总结

若要采用部署预编译,我比较建议使用方案2(预编译选项>>允许更新预编译站点(不勾选),合并选项>>不合并.为每个页面和空间创建单独的程序集(勾选)的场景)

测试了下,每次发布后页面启动速度非常快,而且方案2可以很清晰的看到预编译的dll的文件名,方便单个更新。

缺点是:每此视图文件的编辑,都需要部署预编译后发布。

使用命令行部署预编译

cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
aspnet_compiler -f -p "D:\Work\ASPNET\PreCompiled.Web\PreCompiled.Web" -v / "E:\Release\PreRelease" -fixednames
E:
cd /Release/PreRelease/bin
del *.xml
cd ..
rd /s/q App_Start
rd /s/q Controllers
rd /s/q Models
rd /s/q obj
rd /s/q Properties
del *.csproj
del *.user
del Web.Debug.config
del Web.Release.config
PAUSE

参考资料:

https://msdn.microsoft.com/zh-cn/library/bb398860(v=vs.100).aspx

https://msdn.microsoft.com/zh-cn/library/ms229863(v=vs.100).aspx#findingthecorrectversion

https://msdn.microsoft.com/zh-cn/library/ms228040(v=vs.100).aspx

http://stackoverflow.com/questions/19810145/web-config-error-unrecognized-attribute-xmlnsxdt-note-that-attribute-names

时间: 2024-08-06 14:45:26

理解 ASP.NET 预编译的相关文章

关于ASP.NET预编译的问题

第一次接触到vs2010的预编译,因为网站源码在部署到服务器上之前要经过预编译过程,其中的aspx文件.cs文件.以及master文件.app_code文件均被编译,然后放到了bin目录下.这样不仅对网站安全有好处(不直接存放源代码),而且在用户访问网站时不用在经过漫长的预编译过程,使响应速度加快. 预编译步骤: 1.运行cmd,打开命令行后,连续输入"cd.."段字符将目录调至c:\>下 2.输入aspnet_compiler.exe文件的详细物理路径,一般是在"C:

asp.net 预编译和动态编译

在asp.net中,编译可以分为:动态编译Dynamical Compilation和预编译(Precompilation). 动态编译 深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation) 预编译 深入剖析ASP.NET的编译原理之二:预编译(Precompilation) 比如vs2013发布站点的时候,可以选择预编译,生成单独文件. 发布后,你可以看到bin目录下的文件

ASP.NET 预编译命令(解决发布后第一次访问慢问题)

ASP.NET 编译工具 (Aspnet_compiler.exe) 官方说明 新建bat文件 @echo off   CD /d C:\Windows\Microsoft.NET\Framework\v2.0.50727   aspnet_compiler -p E:\wwwroot\站点主目录 -v /   echo 命令执行成功!   pause 请注意,上面的v2.0.50727代表项目的.NET版本,可根据项目版本替换成以下版本 v2.0.50727 v3.0 v3.5 v4.0.30

ASP.NET 动态编译、预编译和 WebDeployment 项目(转)

概述 在 Web 服务器上,既可以部署源文件,也可以部署编译后程序集. 若部署源文件,则当用户访问时,Web 应用程序会被动态编译,并缓存该程序集,以便下次访问. 否则,若部署程序集,Web 应用程序能直接使用. 动态编译 本文针对 VS 2008.Web 应用程序要想为请求提供服务,ASP.NET 必须首先分析 Web 应用程序的代码,并将其编译成一个或多个程序集.当编译代码时,会将代码编译为 Microsoft 中间语言(MSIL,与具体编程语言和 CPU 无关的语言).运行时,MSIL 将

JavaScript预编译

今天用了大量时间复习了作用域,预编译等等知识 看了很多博文,翻开了以前看过的书 发现当初觉得自己学的很明白,其实还是存在一些思维误区 今晚就整理了一下凌乱的思路 先整理一下预编译的知识吧,日后有时间再把作用域详细讲解一下 大家要明白,这个预编译和编译是不一样的 JavaScript是解释型语言, 既然是解释型语言,就是编译一行,执行一行 传统的编译会经历很多步骤,分词.解析.代码生成什么的 日后有时间再给大家科普 下面就给大家分享一下我所理解的JS预编译 JavaScript运行三部曲 页面加载

JavaScript预编译原理分析

今天用了大量时间复习了作用域.预编译等等知识 看了非常多博文,翻了翻曾经看过的书(好像好多书都没有讲预编译) 发现当初认为自己学的非常明确,事实上还是存在一些思维误区 (非常多博文具有误导性) 今晚就整理了一下凌乱的思路 先整理一下预编译的知识吧,日后有时间再把作用域具体解说一下 大家要明确.这个预编译和传统的编译是不一样的(能够理解js预编译为特殊的编译过程) JavaScript是解释型语言, 既然是解释型语言,就是编译一行.运行一行 传统的编译会经历非常多步骤,分词.解析.代码生成什么的

C语言的预编译,程序员必须懂的知识!【预编译指令】【预编译过程】

由“源代码”到“可执行文件”的过程包括四个步骤:预编译.编译.汇编.链接.所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译阶段仅仅对源代码的单词进行变换,而不是对程序中的变量.函数等. 预编译指令的基本知识不作详细介绍,只稍作汇总,重点是后面的我能想到的 使用时的注意事项. 1. 基本内容 预编译指令基本分类如下 类别 指令 预定义符号__FILE__.__LINE__.__DATE__.__TIME__.__STDC__宏#define文件包含#inclu

深入理解include预编译原理

你了解 #include 某个 .h 文件后,编译器做了哪些操作么? 你清楚为什么在 .h文件中定义函数实现的话需要在函数前面加上 static 修饰么?你知道 #ifndef……#define……#endif 这种防止头文件重复包含的精髓所在么?本文就是来探讨这些问题,并给出我的理解和思考,欢迎大家留言交流. 1.  #include 命令的作用 1.1  什么情况不使用 include //a.c文件 void test_a() { return; } //b.c文件 void test_a

网站优化记录-通过命令预编译Asp.net 网站,成功优化到毫秒级别。

在去年一次项目上线时发现部署的站点首次访问跟回收后响应特别慢,每次都在3秒以内.(使用的是vs工具预编译的方式发布),在随后找到解决办法是通过命令预编译Asp.net 网站,成功解决站点响应在毫秒级别. 预编译 ASP.NET 网站 预编译 ASP.NET 网站可缩短用户的初始响应时间,因为页在第一次被请求时无需编译.这对于经常更新的大型网站尤其有用. https://msdn.microsoft.com/zh-cn/library/ms227972(VS.80).aspx 微软介绍 使用说明打