我的网站设置在
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?
回答我自己的问题,以防有人遇到这个问题。 结果 web.config 文件有
<hostingEnvironment shadowCopyBinAssemblies="false" />
指令,我什至不知道它的存在。
此设置告诉 IIS 在适当的位置执行所有内容,而不是在
Temporary ASP.NET Files
文件夹中。
关闭准备部署的网站的一种快速可靠的方法是在网站的根文件夹中创建一个名为 App_Offline.htm (
~/App_Offline.htm
) 的文件。内容是可选的,如果存在,它会为所有请求提供服务,直到 App_Offline.htm 被删除。此方法几乎适用于所有情况 - 包括用于 shadowCopyBinAssemblies
的任何值。
基本上 App_Offline 是 Web 部署使用的 IIS 的一项功能,以确保其可以正确部署 - 避免任何锁定问题等。它似乎在 IIS 中的非常低的级别上运行,它实际上是一个杀死应用程序池的文件系统观察程序。这意味着您可以轻松地自行创建和删除此文本文件,而无需进行 Web 部署来停止和重新启动(或至少重新启用)您的应用程序。
取自 MS 文档:
当 ASP.Net 检测到存在名为“App_Offline.htm”的文件时,它将自动关闭托管该应用程序的应用程序域。发布过程完成后,App_Offline.htm 文件将被删除,网站将再次上线。
更新 - 22/5/2019
可能值得指出的是,创建 app_offline 文件会导致发生 2 件不同的事情:
w3wp.exe
实例终止 - 即您的“应用程序域”(如任务管理器中所示) - 又名锁的所有者。当该进程终止时,所有锁都会被释放。根据我的经验,这通常很快。 基于一些高流量站点的个人/痛苦经历,并且作为绝对的最后手段...如果出于某种原因 IIS 站点不会停止/释放锁定/中止现有请求,则其可能会加载或以其他方式阻止进程退出- 在正常情况下,app_offline 应该很快杀死该网站。在这些情况下,假设您知道请求不会完成,或者您只是不关心并且需要站点停止或重新启动,请创建应用程序脱机文件,使用任务管理器终止 w3wp.exe 进程,执行更改,然后删除应用程序离线文件。下一个请求将启动一个新的应用程序域(并且显然会放弃任何待处理的请求 - 因此请谨慎执行 - 这可能会或不会成为问题,具体取决于您的站点)。
打开 IIS 管理器,停止并重新启动特定于您的项目的 IIS。比清理和构建您的项目