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

Ang*_*ker 6 .net c# 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
Run Code Online (Sandbox Code Playgroud)

并且它不仅仅是.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文件夹中?

在此输入图像描述

Ang*_*ker 8

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

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


Mis*_*ith 6

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

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

取自MS docs:

当ASP.Net检测到名称为"App_Offline.htm"的文件存在时,它将自动关闭托管该应用程序的应用程序域.发布过程完成后,将删除App_Offline.htm文件,该站点将再次联机.

请参阅:https://docs.microsoft.com/en-us/iis/publish/deploying-application-packages/taking-an-application-offline-before-publishing

  • 当应用脱机时,并非所有被 IIS 锁定的文件都会被释放。添加 app_offline.htm 会停止创建新锁,但不会使 IIS 释放锁。 (2认同)

sal*_*man 6

看起来像视觉工作室的问题。

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

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

  • 尝试重新启动视觉工作室,但没有任何运气。

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

在那之后,我什至将配置改回“发布”,它仍然没有显示任何 dll 文件锁定错误。所以,很可能它是visual studio的内部错误。在此处输入图片说明