我有以下情况:
我发布了一个包含多个二进制文件的页面,然后由HTTP Receiver接收并使用进程内部Deployer进行部署,所有这些都在IIS中作为本地服务用户运行的专用应用程序池中托管。
页面存储在Broker数据库中,二进制文件使用“D:\ Binaries \ Preview”之类的路径发布到本地文件系统。
将预览文件夹作为只读共享(例如\ machinename \ PreviewBinaries)共享给域用户,以便可以使用Web应用程序显示二进制文件。
十分之九的一切都运行良好,但偶尔发布失败,似乎是因为二进制文件因其被另一个进程锁定而无法覆盖。我已经使用ProcessMon和其他工具来尝试建立可能锁定这些文件的内容(无济于事)。有时我可以手动删除图像,然后再次发布作品。如果我在服务器上重新启动IIS,我总是可以删除文件并发布。
有没有人对可以锁定这些图像的进程有任何建议?有没有人见过这个问题?我可以发布到共享的任何问题吗?或者SiteEdit 2009可能会锁定这些文件,因为它似乎只出现在我们的预览服务器上并且直播(没有SiteEdit)似乎没问题。
提前致谢
答案 0 :(得分:3)
如果您使用的是Windows 2008,则可以尝试从磁盘中删除该文件。然后它会告诉您哪个进程锁定了该文件。但是,鉴于重新启动IIS会解锁文件,很可能是IIS会对它们进行锁定。
我没有看到SiteEdit 2009如何导致锁定这些文件。鉴于您可以在另一个盒子上安装预览服务器,SiteEdit只能通过HTTP与该服务器通信。它永远不会直接访问预览服务器上的文件,甚至不会通过CD API访问。只需定期向您的网络服务器发出请求,就像访问者一样。
答案 1 :(得分:3)
同样,不是直接的答案,但我想分享这个:
我见过类似的情况,我将Pages发布到Broker数据库和Binaries到文件系统。当我将应用程序池的标识更改为网络服务时,此问题消失了,我没有进一步研究。
答案 2 :(得分:3)
好吧,似乎有问题的代码出现在我们正在使用的Presentation Framework中。该框架使用Response.TransmitFile(binaryPath)将二进制文件异步传输到客户端。似乎这会产生temporary lock handle on the binaries(即使它们在只读共享上)。
我们删除了这行代码,并以另一种方式将应用程序修改为服务器二进制文件(我们现在重写路径以便IIS可以直接传输文件)。这似乎解决了这个问题,并改善了网站性能。
感谢您的所有建议,它帮助我排除了所有不会导致问题的事情,因此我找到了根本原因。
答案 3 :(得分:2)
是否有运行的防病毒或索引服务。在您不希望它们的那一刻,这些往往会占用非常短暂的锁。特别是对于防病毒软件,这通常就像一个进程放弃锁定一样,就在你的其他进程尝试获取锁定之前。如果这是问题,那么设置一些排除目录应该会有所帮助。
答案 4 :(得分:1)
我发现您使用过Process Monitor,但是您尝试过Sysinternals Process Explorer吗? “Find-> Find Handle或Dll”对于这类事情非常有用。或者如果您更喜欢命令行工具,Sysinternals aslo会生成handle.exe,它会为您转储所有内容。