Shadow Copying导致ASP.NET应用启动很慢的解决办法
<h1 id="whats-shadow-copying">What's Shadow Copying? 我们安装一个应用程序并启动后,我们是无法更新应用程序安装目录中程序集文件的。如果强制替换会提示文件正在使用,如下图所示。 那你可能会问,为什么会无法更新呢? 因为启动应用程序时,CLR会首先创建应用程序域,然后在应用程序域中加载程序集并将其锁定。因此在卸载程序集之前是无法更新文件的。而卸载程序集的唯一办法就是卸载加载程序集的应用程序域。 到这里,你可能会好奇,为什么在开发ASP.NET网站时,我们却可以持续编译项目,而不会报这个提示呢?毕竟我们是从编译目录起的站点啊,而且我们每次编译会更新程序集的啊?!!! 这个疑问的答案就是我们本文的主题——Shadow Copying(卷影复制)。
ASP.NET使用了卷影复制这种技术,允许资源保持连续可用,而不会干扰AppDomain中的代码执行。 在ASP.NET应用程序启动时,它会将应用程序路径中的程序集文件复制到另外一个路径,然后从另外一个路径加载程序集并锁定。这样原来路径的程序集文件就不会锁定,从而可以更新。 Shadow Cope的文件存储在C盘的 默认来说,应用程序目录及其子目录中的程序集会被Shadow Copy。但位于GAC(全局应用程序集缓存)中的程序集不会被复制。 当ASP.NET 应用程序有很多资源和程序集时,它的启动将会耗时很长,而这也正是由于Shadow Copying导致的。 即然Shadow Copying会导致大体量的ASP.NET应用启动很慢,那有没有办法改进呢?
第一种就是关闭Shadow Copying:将 第二种就是手动指定CLR的应用程序基础子目录,以便在加载程序集时进行搜索:
probing节点下的privatePath中指定的子目录是不会进行Shadow Copying的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何在.net核心框架中使用TransactionScope?我
- asp.net-mvc – MVC3自定义格式化日期的不显眼日期验证
- 通过Asp.net中Button的CommandArgument传递多个参数
- asp.net – 数据注释 – 使用属性扩展并在资源文件中存储正
- .net – IDictionary到SelectList?
- ASP.NET POST-DATA截断为49152字节(48K)
- .NET Core的文件系统[1]:读取并监控文件的变化
- asp.net-mvc-2 – 使用Ninject返回null的HttpHandler属性注
- asp.net-core – AspNetCore中的控制器配置
- 如何使用ASP.NET在纯HTML页面上执行表单验证?