【问题标题】:Why is IIS Worker Process locking a file?为什么 IIS 工作进程会锁定文件?
【发布时间】:2018-09-14 14:25:15
【问题描述】:

我的网站设置在D:\RW_System\RW_Webroot\BrokerOffice.Admin 文件夹中(截图如下)。这是一个 .NET、C# WebForms 应用程序。

无论出于何种原因,当我想将更改部署到站点时,我尝试将文件复制过来,但 IIS 将 DLL 锁定在站点设置的路径中:

C:\Users\rizzo\Desktop>handle64 hiqpdf

Nthandle v4.11 - Handle viewer
Copyright (C) 1997-2017 Mark Russinovich
Sysinternals - www.sysinternals.com

w3wp.exe  pid: 3700   type: File  2954: D:\RW_System\RW_Webroot\BrokerOffice.Admin\bin\HiQPdf.dll

锁定的不仅仅是那个 .dll - 它是 \bin 文件夹中的所有 DLL。我的理解是 IIS 将所有内容复制到 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\ 下的文件夹并从那里执行。

我在盒子上有许多其他站点,其中包含多个 DLL 引用,正如预期的那样,w3wp.exe 将它们锁定在 Temporary ASP.NET Files 文件夹中。

IIS 或我的代码中是否有设置导致 IIS 锁定 /bin 文件夹中的 DLL?

【问题讨论】:

  • @mjwills 所有引用的 DLL 都会出现问题。我认为它们已被锁定,因为我无法覆盖它们。而且,我运行的handle 命令(见问题)显示 w3wp.exe 已锁定 hiqpdf.dll。
  • 问题是否只出现在使用HiQPdf.dll的网站上? 您提到它没有出现在您的某些网站中。他们在使用那个 DLL 吗?
  • @mjwills 哦,我明白你在说什么。其他网站确实使用 HiQPdf.dll,但他们将其锁定在 Temporary ASP.NET Files 文件夹中。这是handle 命令的完整输出:i.imgur.com/EQRKCaz.png

标签: c# .net iis windows-server-2016


【解决方案1】:

回答我自己的问题,以防有人遇到这个问题。原来 web.config 文件有 <hostingEnvironment shadowCopyBinAssemblies="false" /> 指令,我什至不知道它存在。

此设置告诉 IIS 执行所有内容,而不是在 Temporary ASP.NET Files 文件夹中。

【讨论】:

  • 看来我的问题现在已经解决了.. :D
【解决方案2】:

关闭准备部署的站点的一种快速可靠的方法是在您网站的根文件夹中创建一个名为 App_Offline.htm (~/App_Offline.htm) 的文件。内容是可选的,如果在 App_Offline.htm 被删除之前为所有请求提供服务。此方法几乎适用于所有情况 - 包括用于 shadowCopyBinAssemblies 的任何值。

基本上,App_Offline 是 Web Deploy 使用的 IIS 的一项功能,以确保它可以正确部署 - 避免任何锁定问题等。它似乎在 IIS 中以非常低的级别运行,它实际上是一个杀死应用程序池的文件系统观察程序。这意味着您可以轻松地自己创建和删除此文本文件,而无需通过网络部署来停止和重新启动(或至少重新启用)您的应用程序。

取自 MS 文档:

当 ASP.Net 检测到名为“App_Offline.htm”的文件存在时,它会自动关闭托管应用程序的应用程序域。发布过程完成后,App_Offline.htm 文件将被删除,网站将重新上线。

Microsoft's article on taking an application offline

更新 - 22/5/2019

可能值得指出的是,创建 app_offline 文件会导致两件不同的事情发生:

  1. IIS 将立即停止处理 请求,并开始返回带有 app_offline 文件内容的 HTTP 503“暂时不可用”响应。
  2. IIS 启动一系列事件,导致w3wp.exe 的实例终止 - 这是您的“应用程序域”(如任务管理器中所示) - 也就是锁的所有者。当该进程终止时,所有锁都会被释放。根据我的经验,这通常很快。

基于一些高流量站点的个人/痛苦经验,并且作为绝对的最后手段...如果 IIS 站点由于某种原因不会停止/释放锁定/中止现有请求,它可能会停止加载或以其他方式阻塞进程退出 - app_offline 在正常情况下应该很快杀死站点。在这些情况下,假设您知道请求不会完成,或者您只是不关心并且需要站点停止或重新启动,请创建应用程序脱机文件,使用任务管理器终止 w3wp.exe 进程,执行您的更改,然后删除应用离线文件。下一个请求会启动一个新的应用程序域(显然会放弃任何待处理的请求 - 所以请谨慎行事 - 这可能会或不会出现问题,具体取决于您的站点)。

【讨论】:

  • 当应用程序脱机时,并非所有被 IIS 锁定的文件都会被释放。添加 app_offline.htm 会停止创建新锁,但不会使 IIS 释放锁。
  • @gburton - 我稍微扩展了我的答案 - 这是否涵盖了您的情况?
【解决方案3】:

看起来像是 Visual Studio 的问题。

在我使用配置管理器的“发布”和“调试”选项时,我开始遇到同样的错误。

  • 我也尝试删除 bin 和 obj 文件夹,但由于 IIS Express 工作进程锁定了 dll 文件,因此未能成功。

  • 尝试重新启动 Visual Studio,但没有成功。

最后,当我将配置改回“调试”并编译应用程序时,构建成功,没有任何错误或警告。

在那之后,我什至将配置改回“发布”,它仍然没有显示任何 dll 文件锁定错误。所以,很可能它是视觉工作室的内部错误。

【讨论】:

    【解决方案4】:

    在任务栏中右键单击IIS express,然后将鼠标悬停在您的项目上。并选择停止您的项目。 IIS express

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多