概述

在 Web 服务器上,既可以部署源文件,也可以部署编译后程序集。

若部署源文件,则当用户访问时,Web 应用程序会被动态编译,并缓存该程序集,以便下次访问。

否则,若部署程序集,Web 应用程序能直接使用。

动态编译

本文针对 VS 2008。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) 以及其他文件,例如它们的后台代码和 Web 应用程序的类文件。

更改时重新编译

对 Web 应用程序文件的任何更改都会自动使缓存的编译程序集无效,并触发所有受影响的资源重新编译。

当下一次向代码发出请求时,ASP.NET 会识别该代码是否已更改,并重新编译 Web 应用程序受影响的资源,使你能用最小的编译处理开销快速开发应用程序。

注意,根据对资源进行的更改情况,结果的范围可能从重新编译单个页面到重新编译整个 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 文件)
  • 主题、母版页和其他源文件
编译输出

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

  • 编译文件夹的位置

默认情况下,当您编译 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 属性来配置根位置。如下所示:

<system.web>
<compilation
tempDirectory=""
debug="False"
strict="False"
explicit="True"
batch="True"
batchTimeout="900"
maxBatchSize="1000"
maxBatchGeneratedFileSize="1000"
numRecompilesBeforeAppRestart="15"
defaultLanguage="vb"
urlLinePragmas="False"
assemblyPostProcessorType="">
<assemblies>
<clear />
</assemblies>
<buildProviders>
<clear />
</buildProviders>
<expressionBuilders>
<clear />
</expressionBuilders>
</compilation>
</system.web>

此可选属性能指定在编译期间用于临时文件存储的目录。默认值为空字符串 ("")。若为空字符串并且当前进程具有所需的访问权限,则文件将存储在以下目录中:

%FrameworkInstallLocation%\Temporary ASP.NET Files
动态编译的优劣

ASP.NET 动态编译能在部署 Web 应用程序之前修改源代码,而不必显式编译代码。如果修改源文件,则 ASP.NET 会自动重新编译该文件,并更新所有链接的资源。除非 <processModel> 一节已更改,否则 IIS 服务器不必重新启动,所做的更改即会生效。

此外,还可以通过为新文件类型创建在编译期间调用的自定义生成提供程序,来扩展 ASP.NET 生成系统。

动态编译会平均延长用户的初始响应时间,因为页和代码文件必须在首次被请求时编译。对于经常更新的大型站点来说,可能是个问题。动态编译不提供某些功能,如不能在用户访问站点之前识别编译时的 Bug。

预编译和 WebDeployment 项目

预编译

ASP.NET 可以预编译网站,然后再将其提供给用户。这样做有很多优点:

  • 由于页和代码文件在第一次被请求时无需编译,因此可以缩短对用户的响应时间。这对于更新频繁的大型网站尤为有用。
  • 可以在用户看到网站之前识别编译时的 Bug。
  • 可以创建站点的已编译版本,并将该版本部署到成品服务器,而无需使用源代码。

预编译决策。使用哪种编译模型。如下所示:

  • 快速开发应用程序而不考虑代码的编译。 使用默认编译(无预编译)。
  • 缩短对网站的首次页请求的响应时间。 使用就地预编译或部署编译选项之一。
  • 分离源代码和用户界面 (UI) 代码。 使用可更新用户界面的预编译。
  • 在不更改源代码的情况下修改 UI 代码。 使用可更新用户界面的预编译。
  • 从成品服务器移除所有源代码和用户界面代码。 使用不可更新用户界面的预编译。
  • 通过替换特定程序集来更新应用程序。 使用名称固定的预编译。
  • 使用具有强名称的程序集提高应用程序的安全性。 使用带签名程序集的预编译。
WebDeployment 项目

VS 2008 通过复制(Copy)和发布(Publish)Web网站来部署(deployment)网站。但在很多高级的情况下,开发者需要下面这些能力。

  • 更多的控制程序集的命名和输出。
  • 自定义生成(build)前和生成(build)后的处理动作。
  • 在生成(build)期间,排除、添加和转换文件和目录的能力。
  • 根据生成(build)配置,来修改 Web.config 文件以改变数据库连接字符串,应用程序设置,或是 Web 引用的 URL。例如,在开发,测试,演示和发布(release)时,使用不同的值。

VS 提供的一个解决方案——Web Deployment 项目。

Web Deployment 项目是 VS 的插件包,它不会改变 VS 任何特性的行为,只是简单地添加一个额外的功能,用来 Web 站点的部署。

Web Deployment 项目是与其相关的一个 Web 站点的 MSBuild 项目,它完全集成到 VS 生成配置管理中,并为编译和部署提供配置选项,例如调试(Debug)和发布(Release)。Web Deployment项目是一个扩展,能够创建生成前(pre-build)和生成后(post-build)的动作。

Web Deployment 项目不会改变 VS 站点的生成方式。它只是 Web 站点作为输入,把产生的预编译 Web 站点作为输出,不会以任何方式改变源 Web 站点项目的文件。

参考资料

ASP.NET 动态编译 http://msdn.microsoft.com/zh-cn/library/ms366723(v=VS.90).aspx

ASP.NET 预编译 http://msdn.microsoft.com/zh-cn/library/bb398860(v=VS.90).aspx

WebDeployment 项目 http://msdn.microsoft.com/en-us/library/aa479568.aspx

ASP.NET 动态编译、预编译和 WebDeployment 项目(转)的更多相关文章

  1. ASP.NET MVC5 视图预编译

    ASP.NET MVC5 视图预编译 ASP.NET MVC5 视图预编译   关于Razor视图及引擎原理,就不多说了. 这里通俗或者不恰当地说,cshtml视图文件是先编译成dll文件,再通过视图 ...

  2. Asp.Net Core 禁用预编译

    在.NET Core 2 Web API应用程序中,MS VS 2017中的发布到文件夹功能产生: <ProjectAssembly>.PrecompiledViews.dll <P ...

  3. .Net Core Razor 预编译,动态编译,混合编译

    预编译 预编译是ASP .Net Core的默认方式.在发布时,默认会将系统中的所有Razor视图进行预编译.编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xx ...

  4. mybatis深入理解之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  5. mybatis之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  6. mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  7. Mybatis参数预编译

    Mybatis参数预编译 一.数据库预编译介绍 1.数据库SQL语句编译特性: 数据库接受到sql语句之后,需要词法和语义解析,优化sql语句,制定执行计划.这需要花费一些时间.但是很多情况,我们的一 ...

  8. asp.net 预编译和动态编译

    在asp.net中,编译可以分为:动态编译Dynamical Compilation和预编译(Precompilation). 动态编译 深入剖析ASP.NET的编译原理之一:动态编译(Dynamic ...

  9. ASP.NET Core Razor 视图预编译、动态编译

    0x01 前言 ASP.NET Core在默认发布情况下,会启动预编译将试图编译成xx.Views.dll,也许在视图中打算修改一处很细小的地方我们需要再重新编译视图进行发布.下面我将从 ASP.NE ...

随机推荐

  1. css中的clear的正真意义

    网上包括w3cschool 的说法都是 不允许浮动.消除浮动 这样的说法,却看了还是不知道什么意思,一些地方说不通. 所以找到w3c css 的英文文档,如下是节选: 'clear'Values ha ...

  2. POJ 1151 - Atlantis 线段树+扫描线..

    离散化: 将所有的x轴坐标存在一个数组里..排序.当进入一条线段时..通过二分的方式确定其左右点对应的离散值... 扫描线..可以看成一根平行于x轴的直线..至y=0开始往上扫..直到扫出最后一条平行 ...

  3. Java系列--第八篇 基于Maven的SSME之定时邮件发送

    关于ssme这个我的小示例项目,想做到麻雀虽小,五脏俱全,看到很多一些web都有定时发送邮件的功能,想我ssme也加入一下这种功能,经查询相关文档,发现spring本身自带了一个调度器quartz,下 ...

  4. 利用css3-animation来制作逐帧动画

    前言 趁着还没有元旦之前先码一篇文章,不然到时候估计又被各种虐了,所以趁现在还有力气先来一篇.今天来聊聊css3中的动画属性animation,对这个属性懵懂是在很早的时候有前辈用这个 animati ...

  5. HTML&CSS基础学习笔记1.19-DIV标签1

    div标签 这里我们要认识一下HTML里使用非常多的的一个标签:<div>. <div>标签定义文档中的分区或节(division/section),他可以把文档分割为独立的. ...

  6. github进行修改

    1)git status:可以让我们时刻掌握仓库当前的状态. 2)git diff [文件名]:查看改变的详细信息,显示的结果是Unix通用的diff格式. 步骤: 1.修改文件 2.通过git ad ...

  7. windows下使用批处理调用exe和服务

    手动调用exe或者启动服务很麻烦,可以使用.bat批处理文件,双击运行即可.步骤如下:创建一个新的txt文件但是保存成.bat结尾的文件(选择用记事本打开编写命令),输入代码内容格式如下: @echo ...

  8. fuck WPFG.org

    今天一旦进入国外网站,就立刻跳转到WPFG.org.可能DNS被劫持污染了吧.用OpenDNS就行了.然后就没有这回事发生了 参考以下: https://www.opendns.com https:/ ...

  9. java decompiler如何去掉行号

    今天想反编译jar包保存源代码,默认前面加了行号,不知道这个小工具如何设置去掉行号? 反编译后: 找到它的安装路径,我的是:C:\Program Files\decomp.然后将该路径加入到环境变量p ...

  10. 15个提高编程技巧的JavaScript工具

    原文地址:http://www.imooc.com/wenda/detail/243523 JavaScript脚本库是一个预先用JavaScript语言写好的库,它方便了我们开发基于JavaScri ...