我正在编写一段.NET代码,需要覆盖IIS 6或7上托管的网站中的图像文件。应该触摸图像的唯一进程是IIS和我的覆盖图像的进程。
我想知道IIS是否会锁定文件,导致我的覆盖代码抛出异常。
答案 0 :(得分:5)
简短的回答是尝试打开文件,如果失败,请等待几秒钟再试一次,循环直到成功或超时。
但是,如果你要更新这些图像,那么你真的在这里击败了IIS的缓存机制。 Web服务器提供不断变化的文件并不健康。 Web服务器非常适合提供静态文件。
现在,如果你的图像是如此动态,也许你需要通过服务器端程序来提供它。生成您的图像(或通过远程处理或WCF从其他程序读取)并提供服务。您的服务器端程序也可以执行某种形式的缓存。如果它只持续很短的时间,甚至不需要保留图像文件。
如果您只需要偶尔更换这些图像,则可以继续重试。
现在,如果这些图像非常重要,并且您真的希望IIS在有新版本时立即停止提供旧版本(您是否正在为CAPTCHA服务?),并且IIS多次为此文件提供服务每秒,然后您的进程可能无法找到插槽。然后您需要找到一种方法告诉IIS停止并等待新版本 - 重新启动它应该工作,因为您没有更改图像经常(否则,你已经走了动态路线)。
答案 1 :(得分:3)
即使IIS在读取文件时可能会锁定该文件,您也可以将文件重命名,并将其替换为新版本。此策略还可用于解决“半写文件”问题,在完全编写文件之前,文件开始被读取。
答案 2 :(得分:2)
这是可能的,因为在读取任何文件时,它在读取期间被锁定,因此您可能会遇到IIS正在读取并提供文件的情况,并且您正尝试写入该文件同时。
This和this可能会在等待文件,然后锁定文件方面提供一些帮助。请记住,在等待文件时,您可能会导致IIS响应速度变慢。
答案 3 :(得分:0)
IIS将锁定文件。
如何为图像编写HttpHandler,以便直接控制图像的投放方式和位置。
由于您随后控制了图像的呈现方式以及图像的替换方式,因此您需要设计的是维护顺序的常用锁定机制。
答案 4 :(得分:0)
通过服务方式,我假设它读取文件并传递给客户端(浏览器)。对于此操作,根本不需要锁定文件。所以我们可以假设它在读模式下打开文件。 IIS使用TransmitFile()API通过套接字发送文件。它使用OS内部缓存来提高性能,不应该锁定文件。
我们可以使用sysinternals中的processexplorer查看哪个文件打开了哪个文件。这将帮助您查找其实际是否由任何其他进程打开。