Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么IIS工作进程会锁定文件?_C#_.net_Iis_Windows Server 2016 - Fatal编程技术网

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

C# 为什么IIS工作进程会锁定文件?,c#,.net,iis,windows-server-2016,C#,.net,Iis,Windows Server 2016,我的网站设置在D:\RW\u System\RW\u Webroot\brokerofice.Admin文件夹中(下面的屏幕截图)。这是一个.NET、C#WebForms应用程序 无论出于何种原因,当我想将更改部署到站点时,我会尝试复制文件,但IIS会在站点设置的路径中锁定DLL: C:\Users\rizzo\Desktop>handle64 hiqpdf Nthandle v4.11 - Handle viewer Copyright (C) 1997-2017 Mark Russi

我的网站设置在
D:\RW\u System\RW\u Webroot\brokerofice.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将它们锁定在
临时ASP.NET文件
文件夹中

IIS或我的代码中是否存在导致IIS锁定/bin文件夹中DLL的设置


回答我自己的问题,以防有人遇到这个问题。原来web.config文件有
指令,我甚至不知道它的存在


此设置告诉IIS就地执行所有内容,而不是在
临时ASP.NET文件
文件夹中执行。

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

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

摘自MS文档:

当ASP.Net检测到名为“App_Offline.htm”的文件存在时,它将自动关闭承载应用程序的应用程序域。发布过程完成后,App_Offline.htm文件将被删除,网站将再次联机

更新日期:2019年5月22日

通过创建app_离线文件可能值得指出,它会导致两种不同的情况发生:

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

    似乎是visual studio的问题

    在我使用Configuration manager的“Release”和“Debug”选项时,我开始遇到相同的错误

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

    • 试图在没有任何运气的情况下重新启动visual studio

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


    在那之后,我甚至将配置改回“Release”,它仍然没有显示任何dll文件锁定错误。所以,这很可能是VisualStudio的内部缺陷

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

    @mjwills所有引用的DLL都会出现问题。我想它们被锁定了,因为我无法覆盖它们。另外,我运行的
    handle
    命令(请参见问题)显示w3wp.exe已锁定hiqpdf.dll。该问题是否仅在使用
    hiqpdf.dll
    的网站中出现?你提到你的一些网站上没有出现这种情况。他们在用那个DLL吗?@mjwills哦,我明白你的意思了。其他网站确实使用HiQPdf.dll,但它们将其锁定在
    临时ASP.NET文件
    文件夹中。以下是
    handle
    命令的完整输出:当应用程序脱机时,并非所有被IIS锁定的文件都会被释放。添加app_offline.htm会停止创建新锁,但不会使IIS释放锁。@gburton-我扩展了我的答案一点-这是否涵盖了您的情况?看起来我的问题现在已经解决了..:D