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

zpqajqem  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(274)

我的网站安装在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

我的理解是IIS将所有内容复制到C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\下的文件夹中,并从那里执行内容。
我有一些其他的网站上的框与多个DLL引用和,正如预期的那样,w3wp.exe有他们锁定在Temporary ASP.NET Files文件夹。
IIS中是否有设置或我的代码中是否有什么东西导致IIS锁定/bin文件夹中的DLL?

drkbr07n

drkbr07n1#

如果有人遇到这个问题,我会回答自己的问题。结果发现web.config文件中有<hostingEnvironment shadowCopyBinAssemblies="false" />指令,而我甚至不知道它的存在。
此设置告诉IIS就地执行所有内容,而不是在Temporary ASP.NET Files文件夹中执行。

wswtfjt7

wswtfjt72#

一种快速可靠的方法是在网站的根文件夹中创建一个名为App_Offline.htm(~/App_Offline.htm)的文件,以关闭准备部署的网站。内容是可选的,如果存在,则在删除App_Offline.htm之前,它将为所有请求提供服务。此方法几乎适用于所有情况,包括shadowCopyBinAssemblies使用的任何值。
基本上,App_Offline是Web Deploy使用的IIS的一个功能,用于确保它可以正确部署-避免任何锁定问题等。它似乎在IIS中以非常低的级别运行,它实际上是一个杀死应用池的文件系统监视器。这意味着您可以轻松地自己创建和删除此文本文件,而无需Web Deploy停止和重新启动(或至少重新启用)您的应用。
摘自MS文档:
当ASP.Net检测到存在名为“App_Offline.htm”的文件时,它将自动关闭承载该应用程序的应用程序域。发布过程完成后,App_Offline.htm文件将被删除,站点将重新联机。
请参阅Microsoft's article on taking an application offline

  • 更新日期-2019年5月22日 *

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

  1. IIS将立即停止服务 * 新 * 请求,并开始返回HTTP 503“暂时不可用”响应以及app_offline文件的内容。
  2. IIS启动一系列事件,导致w3wp.exe示例的终止--这是您的“应用程序域”(如任务管理器中所示)--也就是锁的所有者。当该进程终止时,所有锁都被释放。根据我的经验,这通常非常快。
    基于个人/痛苦的经验,一些高流量的网站,并作为一个绝对的最后手段...如果由于任何原因,一个IIS网站不停止/释放锁定/中止现有的请求,它可能是关闭加载或其他东西阻止进程退出- app_offline应该杀死网站在正常情况下非常快。在这些情况下,并假设你知道的请求不会完成,或者您只是不关心并需要站点停止或重新启动,请创建应用程序脱机文件,使用任务管理器终止w3wp.exe进程,执行您的更改,然后删除应用程序脱机文件。下一个请求启动一个新的应用程序域(并且显然会放弃任何待处理的请求--因此要谨慎操作--这可能是个问题,也可能不是,具体取决于您的站点)。
mkshixfv

mkshixfv3#

看起来像是visual studio的问题。
在我使用配置管理器的“发布”和“调试”选项时,我开始遇到同样的错误。

  • 我也尝试删除bin和obj文件夹,但由于dll文件被IIS Express工作进程锁定而失败。
  • 尝试重新启动visual studio,但没有成功。

最后,当我将Configuration更改回“Debug”并编译应用程序时,构建成功,没有任何错误或警告。
在那之后,我甚至将配置更改回“Release”,但它仍然没有显示任何dll文件锁定错误。因此,很可能是Visual Studio的内部错误。

相关问题