为什么IIS工作进程会锁定文件?

14

我的网站设置在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文件的原因?

enter image description here

3个回答

18

为了帮助遇到相同问题的人,我自己回答这个问题。原来 web.config 文件中有 <hostingEnvironment shadowCopyBinAssemblies="false" /> 指令,而我之前根本不知道。

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


11
一种快速可靠的使网站进入待部署状态的方法是在网站根目录下创建一个名为App_Offline.htm(~/App_Offline.htm)的文件。内容是可选的,如果存在,则该内容将为所有请求提供服务,直到删除App_Offline.htm。此方法几乎适用于所有情况-包括用于shadowCopyBinAssemblies的任何值。
基本上,App_Offline是IIS的一个功能,由Web Deploy使用以确保它可以正确部署-避免任何锁定问题等。它似乎在IIS中运行在非常低的级别上,它实际上是一个文件系统监视器,可以杀死应用程序池。这意味着您可以轻松地自己创建和删除此文本文件,而无需使用Web Deploy来停止和重新启动(或至少重新启用)应用程序。
摘自MS文档:
当ASP.Net检测到存在名为“App_Offline.htm”的文件时,它将自动关闭托管应用程序的应用程序域。完成发布过程后,将删除App_Offline.htm文件,然后站点将再次在线。
请参见Microsoft有关使应用程序脱机的文章
更新-2019年5月22日
创建app_offline文件可能会导致发生两件不同的事情:
  1. IIS会立即停止提供新的请求,并开始返回HTTP 503“暂时不可用”响应,其中包含app_offline文件的内容。
  2. IIS启动了一系列事件,导致w3wp.exe实例的终止-这是您的“应用程序域”(如任务管理器中所示)-也就是锁的所有者。当该进程死亡时,所有锁都被释放。根据我的经验,这通常非常快速。

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


8

看起来是Visual Studio出了问题。

当我尝试在配置管理器的“Release”和“Debug”选项之间切换时,开始遇到相同的错误。

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接