假设我的ASP.NET应用程序正在进行4次单独的数据库调用。如果在第二次调用之后,我覆盖了BIN文件夹中的DLL,是否会阻止应用程序继续处理,从而导致第3次和第4次数据库调用失败?
任何建议都将不胜感激, MOSH
答案 0 :(得分:45)
ASP.NET在各种资源(包括DLL和ResX文件)上执行名为 shadow replication 的操作。当框架访问文件时,它被锁定以防止直接访问。要防止在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
的 [/编辑] 强>
您可以在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
EDIT2: 我刚刚了解到,您可以修改文件复制操作之间所需的时间长度,以生成AppDomain。
在system.web / httpRuntime元素中,您可以指定 waitChangeNotification 和 maxWaitChangeNotification ,以便不会为复制的每个文件生成新的AppDomain。 请参阅MSDN。
虽然在MSDN上没有这种行为的实例,但最好继续作为HttpRuntime可配置性的参考。
答案 1 :(得分:2)
程序集被加载到app域中,app域监视目录,如果你替换程序集,它将回收应用程序并重新加载程序集。所以是的,你的第3 /第4次电话会失败。