【问题标题】:Does my ASP.NET application stop executing if I overwrite the DLLs?如果我覆盖 DLL,我的 ASP.NET 应用程序会停止执行吗?
【发布时间】:2010-12-09 02:52:19
【问题描述】:

假设我的 ASP.NET 应用程序正在进行 4 次单独的数据库调用。如果在第二次调用后,我覆盖了 BIN 文件夹中的 DLL,它是否会阻止应用程序继续处理,从而导致第三次和第四次数据库调用失败?

任何建议将不胜感激, 莫什

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    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 元素中,您可以指定 waitChangeNotificationma​​xWaitChangeNotification,这样就不会为每个复制的文件生成新的 AppDomain。 见MSDN

    虽然 MSDN 上并没有这种行为的真正示例,但最好保留作为 HttpRuntime 可配置性的参考。

    【讨论】:

    • 我刚刚发现您可以在生成 AppDomain 之前修改文件副本之间的延迟。
    • 我知道这个 .net 延迟,假设我们无能为力,你的文章解释得很好!太棒了!
    【解决方案2】:

    程序集被加载到应用程序域中,应用程序域监视目录,如果您替换程序集,它将回收应用程序并重新加载程序集。所以是的,你的第 3 次/第 4 次调用会失败。

    【讨论】:

    • 我认为该目录是由 asp.net 的 ISAPI dll(AppDomain)而不是 IIS 本身监视的。你有一些关于 IIS 监视目录的资源吗?
    • 我没喝过咖啡,你说得对。它被 AppDomain 监视。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多