在我们的生产构build过程中,根目录中的一个非常大的(10兆字节)静态内容文件有时会被IISlocking,不能被清除任务删除。 这大概是因为当时正在积极向一个或多个客户提供服务。
构build过程在清理之前停止网站
c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com
但是,这不会释放文件 – 我们必须重新启动IIS以使进程放弃其locking。
appcmd.exe
允许您完全使用IIS; 我们不想这样做!
有没有其他方法让IIS放开一个locking的文件,而不重新启动IIS? 简单地停止和启动个人网站是绝对不会释放文件locking。
有一些工具,比如Sysinternal的Process Explorer,可以查找和强制closures文件句柄,但是在这样做之后,应用程序的状态和行为(在这个例子中是IIS)是未定义的。 有些人不会在意,有些人会失误,其他人会很难崩溃。
正确的解决scheme是停止并允许IIS清理释放锁并自行清理,以保持服务器的稳定性。 如果这不可行,您可以在同一个框中创build另一个站点,或者使用新内容创build一个新框,然后移动域名/ IP以将新内容“提升”为生产。
我使用一个叫做“Handle”的小工具来做到这一点。
你基本上通过它被locking的文件的名称,它告诉你什么进程正在使用它:
handle c:\weird.file Something.exe pid: 1000 100: C:\weird.file Something.exe pid: 1000 101: C:\weird.file
然后你通过它-c开关来closures句柄:
handle.exe -c 101 -p 1000 -y handle.exe -c 100 -p 1000 -y
你可能会努力工作,没有包装程序的构build脚本parsing输出,但希望这会有所帮助。
我不知道你的意思是编译临时程序集中的aspx文件。 我们正在使用ASP.NET部署项目 ,预先编译所有aspx / ascx文件。
在将二进制文件从“发布”复制到“bin”文件夹的同时,我们暂时启用一个app_offline.htm文件,在复制所有的程序集(仅仅几秒钟)之后,该文件被删除。 这样我从来没有经历过文件locking。
编辑:
您可以尝试使用appcmd.exe回收应用程序池,而不是停止网站:
C:\Windows\System32\inetsrv\appcmd.exe recycle apppool "My App Pool Name"
Process Monitor应该帮助你进行调查,这里是Mark的博客(写这个工具的人)如何find文件句柄的一个例子 。
你可能想尝试这个解锁器工具来自动解锁文件句柄级别。
不是答案,而是一个解决方法的想法,如果没有办法“解锁”该文件,而不重新启动IIS服务器:
如果你build立/部署到一个新的空文件夹,并将网站的主目录更改为该文件夹呢? 您必须创build一个新的文件夹名称,或者在两个名称之间切换。
我不知道该文件属于哪个文件夹。 如果不必在根文件夹中,则可以将其放入新创build的文件夹中,并创build一个指向该文件夹的虚拟目录。 所以你可以保留你的应用程序的标准主目录。
我现在正在尝试:显然,如果您在目录上激活了索引,可能会出现文件locking的问题。 http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html
这是IIS 6.0,但由于这似乎与操作系统,而不是IIS有关,这可能是根本原因。
当然,停止IIS服务。 也许我没有理解什么,对不起。
注意:不是Windows文件locking语义的专家
Jarrod,你可以重新命名该文件的方式。 您也可以使用临时扩展名创build新文件,然后将其重命名为当前文件。
如果windows文件locking语义的工作类似于POSIX,那么对文件保持当前读取locking的读者应该继续服务旧文件,直到他们closures读取stream,而新读者将打开新文件。
我有同样的问题。 现在我切换到MSDeploy(Web部署) ,现在我可以更新网站可靠而不停止任何事情。 实际上,这一步是在我们的自动化构build工具中编写的,并且始终在没有任何问题的情况下发生。 而且速度也很快