2011-03-22 37 views
3

我写了一段.NET代码,它需要覆盖托管在IIS 6或7上的网站中的图像文件。应该触摸图像的唯一过程是IIS和我的过程,它会覆盖图像。在服务期间IIS 6/7是否锁定图像文件?

我想知道IIS是否会锁定文件,导致我的覆盖代码抛出异常。

+0

你知道你可以这样做吗? '',并在响应中设置MIME类型等.... – 2011-04-01 09:29:29

+0

你是如何写图像? GDI +? – Brook 2011-04-01 13:08:11

回答

2

这是可能的,因为虽然任何文件被读出时,在读期间被锁定,所以你可能会遇到在那里IIS是阅读和提供文件的情况,而你试图写入文件与此同时。

This and this可以提供一些帮助等待文件,然后锁定它。请记住,您可能会导致IIS响应速度慢,因为它也等待文件。

0

IIS将锁定文件。

如何编写图像一个HttpHandler,使您拥有在图像上的投放方式,并从那里直接控制。

既然你那么控制图像的投放和图像的方式代替,所有你需要设计是一种常见的锁定机制,以维持秩序。

5

简短的回答将尝试打开文件,如果失败,等待几秒钟,然后再试,循环直到成功或超时。

但是,如果要更新这些图片很多,你真的在​​这里击败了IIS的缓存机制。 Web服务器提供不断变化的文件是不健康的。 Web服务器在提供静态文件方面非常出色。

现在,如果你的图片是如此的动态,也许你需要通过服务器端程序来服务它来代替。生成您的图像(或通过远程或WCF从另一个程序中读取它)并提供。你的服务器端程序也可能做某种形式的缓存。如果只持续很短的时间,甚至不需要保存图像文件。

如果您只需偶尔更换这些图像,则可以继续重试。

现在,如果这些图像真的很重要,并且您确实希望IIS在您有新版本后立即停止提供旧版本(您是否提供CAPTCHA?),并且IIS正在为此文件提供许多许多那么您的流程可能无法找到插槽。那么您需要找到一种方法告诉IIS停止并等待新版本 - 重新启动它应该可以工作,因为您没有更改图像往往(否则,你会走动的路线)。

3

即使当它读取IIS可以锁定文件,你也许可以重命名文件的方式进行,并用新的版本来替换它。这个策略也可以用来击败'半文件'问题,即在文件完全写入之前开始读取文件。

  1. 与临时文件名创建替换文件
  2. 重命名现有文件的方式进行
  3. 重命名替换文件到它的地方(新工艺拿起)
  4. 删除旧文件时​​锁清除
0

通过服务手段,我假设它读取文件并交付给客户端(浏览器)。对于这种操作,根本不需要锁定文件。所以我们可以假定它正在以读模式打开文件。 IIS使用TransmitFile()API通过套接字发送文件。它使用OS内部缓存来提高性能,并且不应该锁定文件。

我们可以使用sysinternals中的processexplorer查看哪个文件被哪个进程打开。这将帮助您查找其实际是否被其他进程打开。