What's Shadow Copying?

我们安装一个应用程序并启动后,我们是无法更新应用程序安装目录中程序集文件的。如果强制替换会提示文件正在使用,如下图所示。

那你可能会问,为什么会无法更新呢?

因为启动应用程序时,CLR会首先创建应用程序域,然后在应用程序域中加载程序集并将其锁定。因此在卸载程序集之前是无法更新文件的。而卸载程序集的唯一办法就是卸载加载程序集的应用程序域。

到这里,你可能会好奇,为什么在开发ASP.NET网站时,我们却可以持续编译项目,而不会报这个提示呢?毕竟我们是从编译目录起的站点啊,而且我们每次编译会更新程序集的啊?!!!

这个疑问的答案就是我们本文的主题——Shadow Copying(卷影复制)。

Shadow copying enables assemblies that are used in an application domain to be updated without unloading the application domain. This is particularly useful for applications that must be available continuously, such as ASP.NET sites.

卷影复制机制允许我们更新正在被应用程序域中使用的程序集而不需要卸载应用程序域。这个机制对必须保持持续可用的应用程序来说特别有用,比如ASP.NET网站开发。

ASP.NET使用了卷影复制这种技术,允许资源保持连续可用,而不会干扰AppDomain中的代码执行。

在ASP.NET应用程序启动时,它会将应用程序路径中的程序集文件复制到另外一个路径,然后从另外一个路径加载程序集并锁定。这样原来路径的程序集文件就不会锁定,从而可以更新。

Where the file copied to?

Shadow Cope的文件存储在C盘的Temporary ASP.NET Files目录,可能在C:\Users\{UserName}\AppData\Local\Temp下,也可能在C:\Windows\Microsoft.NET\Framework下。找不到可以网上下载search everything工具搜索。

Which files are shadow copied?

默认来说,应用程序目录及其子目录中的程序集会被Shadow Copy。但位于GAC(全局应用程序集缓存)中的程序集不会被复制。

The disadvantage of Shadow Copying

当ASP.NET 应用程序有很多资源和程序集时,它的启动将会耗时很长,而这也正是由于Shadow Copying导致的。

Disabling shadow copying

即然Shadow Copying会导致大体量的ASP.NET应用启动很慢,那有没有办法改进呢?

第一种就是关闭Shadow Copying:将<hostingEnvironment shadowCopyBinAsmblies ="false"/>配置节点添加到Web.Config文件下的System.Web下即可。

第二种就是手动指定CLR的应用程序基础子目录,以便在加载程序集时进行搜索:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Bin;Bin\TestPlugIn" />
</assemblyBinding>

probing节点下的privatePath中指定的子目录是不会进行Shadow Copying的。

Reference

What is the “Temporary ASP.NET Files” folder for?

Shadow Copying Assemblies

重温.NET下Assembly的加载过程

ASP.NET, APPDOMAINS, AND SHADOW-COPYING

Shadow Copying导致ASP.NET应用启动很慢的解决办法的更多相关文章

  1. linux下tomcat启动很慢的解决办法

    1.用vim编辑器打开tomcat的bin目录下的catalina.sh [root@iz09a32x1sghz3z bin]# vi /usr/local/src/java/tomcats/tomc ...

  2. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  3. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  4. dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法

    dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法 grub 启动菜单后加入 rootdelay=90, 如下:/boot/vmlinuz-2.6.3 ...

  5. installshield制作的安装包卸载时提示重启动的原因以及解决办法

    原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...

  6. WIN8.1的安装和打开"这台电脑"速度很慢的解决办法

    WIN8.1的安装和打开"这台电脑"速度很慢的解决办法 对于非服务器用的电脑,如果电脑的内存在2G或更高,首推的操作系统是 WINDOWS8.1 64位企业版,用了就知道,没有比这流畅懂事的操作系统. ...

  7. 【转】android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法---不错不错,重新连接需要花费很长的时间

    原文网址:http://bbs.eeworld.com.cn/thread-438571-1-1.html /*                         * 通过使用if(gatt==null ...

  8. Tomcat几种启动报错及解决办法

    今天真跪了,tomcat的错想到想不到的都遇到了.不记录一下都愧对今天愁掉的hair 在此之前分享一个集错网站,应该是程序员必备的网站之一,不过纯英文,小酸爽 Tags - Stack Overflo ...

  9. zynq中uboot的qspi启动报错及解决办法

    问题描述: 用u-boot-xlnx-v2016.3版本编译的uboot通过qspi flash启动出现如下错误: 尝试在uboot命令行输入"sf probe 0 0 0"挂载q ...

随机推荐

  1. Modbus协议栈实现Modbus RTU多主站支持

    前面我们已经详细讲解过Modbus协议栈的开发过程,并且利用协议栈封装了Modbus RTU主站和从站,Modbus TCP服务器与客户端,Modbus ASCII主站与从站应用.但在使用过程中,我们 ...

  2. 在django中uwsgi的使用,以及安装

    首先了解wsgi是一个python web服务器,uwsgi实现了wsgi所有的功能,性能稳定,效率高的服务器: 1.安装uwsgi pip install uwsgi 2.配置uwsgi [uwsg ...

  3. 前端angular使用crypto-js进行加密

    首先下载大包 npm install crypto-js 然后下载ts版本的包 npm install --save @types/crypto-js 接着在头部导入crypto-js模块 impor ...

  4. cc.Lable组件,RichText组件,AudioSouce组件的使用

    一.cc.Lable组件的使用 1.创建Label的方法 a.通过菜单直接创建Label组件:b.先创建节点,然后在节点上绑定Label组件即可. 2.Label 面板上的属性 String => ...

  5. 在Windows Server2016中安装SQL Server2016

    SQL Server2016安装硬.软件条件:点击打开链接 WinServer2016的安装参见: 在虚拟机中安装Windows Server2016 1. SQL Server2016下载地址: - ...

  6. Nginx 如何设置反向代理 多服务器,配置区分开来,单独文件保存单个服务器 server 主机名配置,通过 include 实现

    samcao 关注 2015.06.15 10:08* 字数 0 阅读 408评论 0喜欢 0   网络结构如上图.可能你只有一个公网的Ip地址. 但是您的内网有个网站需要映射至外网.而又不想添加其它 ...

  7. Asp.net并发请求导致的数据重复插入问题

    前段时间工作中,有客户反应了系统中某类待办重复出现两次的情况.我核实了数据之后,分析认为是并发请求下导致的数据不一致性问题,并做了重现.其实这并不是一个需要频繁调用的功能,但是客户连续点击了两次,导致 ...

  8. Codeforces 258D Little Elephant and Broken Sorting (看题解) 概率dp

    Little Elephant and Broken Sorting 怎么感觉这个状态好难想到啊.. dp[ i ][ j ]表示第 i 个数字比第 j 个数字大的概率.转移好像比较显然. #incl ...

  9. Excel—错误解释

       1.#####! 如果单元格所含的数字.日期或时间比单元格宽,或者单元格的日期时间公式产生了一个负值,就会产生#####!.这个看起来比较简单,大家应该都了解吧. 解决方法:如果单元格所含的数字 ...

  10. bower 基础认识

    bower 跟 npm 很像 都是管理包的工具 只是 bower 偏向前端  npm 前后都能管理 npm init 后是  生产 package.json  下载的包在node_modules文件下 ...