【发布时间】:2010-12-09 02:52:19
【问题描述】:
假设我的 ASP.NET 应用程序正在进行 4 次单独的数据库调用。如果在第二次调用后,我覆盖了 BIN 文件夹中的 DLL,它是否会阻止应用程序继续处理,从而导致第三次和第四次数据库调用失败?
任何建议将不胜感激, 莫什
【问题讨论】:
标签: asp.net
假设我的 ASP.NET 应用程序正在进行 4 次单独的数据库调用。如果在第二次调用后,我覆盖了 BIN 文件夹中的 DLL,它是否会阻止应用程序继续处理,从而导致第三次和第四次数据库调用失败?
任何建议将不胜感激, 莫什
【问题讨论】:
标签: asp.net
ASP.NET 对各种资源(包括 DLL 和 ResX 文件)执行一种称为 影子复制 的操作。当框架访问文件时,它会被锁定以防止直接访问。为了防止锁定 root/bin 或 root/App*_Resources(例如)中的文件,它会将这些资源复制到预定目录。
[编辑]
预定目录默认为类似
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\demo1\9b9144a7\8665ac07
其中 demo1 是您的应用程序和嵌套目录的名称(我假设)根据所包含资源的 AppDomain 的友好名称进行哈希处理。
例如,我有一个名为 dbresourceproviderweb 的目录,来自 MSDN 上由 Michelle Bustamante 编写的资源提供程序示例。在该目录中,有两个文件夹:c8b872e2 和 7fc33f08。更进一步,厄瓜多尔西班牙语的编译资源位于 ...\dbresourceproviderweb\c8b872e2\97074f76\es-EC 和 ...\dbresourceproviderweb\7fc33f08\ac65ebd3\es-EC em>
[/编辑]
您可以在 Application_Start 中更改此目录,如下所述:AssemblyResolve event is not firing during compilation of a dynamic assembly for an aspx page
您可以在 web.config 中关闭卷影复制:
<hostingEnvironment shadowCopyBinAssemblies="false" />
当这些影子复制文件之一在您的应用程序中更新时,会生成一个新的 AppDomain,并且允许当前 AppDomain 中的请求完成,同时所有新请求都指向新的 AppDomain。
有关 Shadow Copying 和 AppDomains 的更多信息,请查看 MSDN 的文章:http://msdn.microsoft.com/en-us/library/ms404279.aspx
编辑2: 我刚刚了解到,您可以修改文件复制操作之间所需的时间长度以生成 AppDomain。
在 system.web/httpRuntime 元素中,您可以指定 waitChangeNotification 和 maxWaitChangeNotification,这样就不会为每个复制的文件生成新的 AppDomain。 见MSDN。
虽然 MSDN 上并没有这种行为的真正示例,但最好保留作为 HttpRuntime 可配置性的参考。
【讨论】:
程序集被加载到应用程序域中,应用程序域监视目录,如果您替换程序集,它将回收应用程序并重新加载程序集。所以是的,你的第 3 次/第 4 次调用会失败。
【讨论】: