为什么IIS Worker Process会锁定文件?

时间:2018-04-04 21:43:48

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

我的网站设置在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将DLL锁定在/ bin文件夹中?

enter image description here

4 个答案:

答案 0 :(得分:8)

如果有人遇到此问题,请回答我自己的问题。结果是web.config文件有<hostingEnvironment shadowCopyBinAssemblies="false" />指令,我甚至不知道它存在。

此设置告诉IIS执行所有操作而不是Temporary ASP.NET Files文件夹。

答案 1 :(得分:6)

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

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

取自MS docs:

  

当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实例终止的事件 - 这是您的“应用程序域”(如任务管理器中所示) - 也就是锁的所有者。当该进程终止时,将释放所有锁。根据我的经验,这通常很快。
  3. 基于一些高流量站点的个人/痛苦经验,并作为绝对的最后手段......如果由于某种原因IIS站点不会停止/释放锁定/中止现有请求,它可能会下载或阻止其他东西进程退出 - app_offline应该在正常情况下很快杀死网站。在这些情况下,并假设您知道请求不会完成,或者您只是不在乎并且需要站点停止或重新启动,创建应用程序脱机文件,使用任务管理器终止w3wp.exe进程,执行更改,然后删除应用程序离线文件。下一个请求会启动一个新的应用程序域(并且显然会放弃任何待处理的请求 - 因此请谨慎操作 - 这可能是也可能不是问题,具体取决于您的站点)。

答案 2 :(得分:1)

看起来像Visual Studio的问题。

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

  • 我也尝试删除bin和obj文件夹,但是由于dll文件被IIS Express工作进程锁定而无法成功。

  • 尝试重新启动Visual Studio,但没有任何运气。

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

在那之后,我什至将配置更改回“释放”,但它仍然没有显示任何dll文件锁定错误。因此,很可能是Visual Studio的内部错误。 enter image description here

答案 3 :(得分:-2)

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