IIS保留了我生成的文件

时间:2020-03-05 18:55:51  来源:igfitidea点击:

我的Web应用程序生成pdf文件,然后通过电子邮件或者传真将其发送给我们的客户。 IIS6会以某种方式保留该文件并阻止其他任何文件请求,声称该文件'..该进程无法访问文件'xxx.pdf',因为该文件正在由另一个进程使用。'

当我回收应用程序池时,一切正常。有人知道为什么会这样吗,我该如何制止它。

谢谢

解决方案

回答

我会仔细检查代码,并确保所有打开(生成)文件的句柄均已正确关闭。有时,我们只是不能依靠垃圾收集器来整理这些东西。

回答

听起来,创建后的文件仍被工作进程锁定。确保关闭文件的所有连接。
(请记住,使用blocks会解决这个问题)

回答

使用finally子句中的适当.Close()或者通过C#的" using"子句,检查磁盘上的所有代码写入文件是否正确关闭了每个句柄

byte[] asciiBytes = getPdf(...);
try{
BinaryWriter bw = new BinaryWriter(File.Create(filename));
bw.Write(pdfBytes);
}
finally {
  if(null != bw)
    bw.Close();
}

使用Response和Content-Disposition子句发送文件

Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=" + PDID + ".pdf");
Response.WriteFile(filename);
Response.Flush();

显示的代码会在大约18个月内创建并发送Pdf文件给客户,而我们从未见过文件被锁定。

回答

  • 如前所述:请注意关闭所有打开的处理程序。
  • 有时Microsoft的索引服务会阻止文件。排除目录

回答

就像大家都说过的那样,在读取/写入PDF文件时,请对已打开的任何IO对象调用" Close"和" Dispose"方法。

但是我想我们已经合并了一个第三方组件?为我们编写PDF?如果是这种情况,我们可能需要检查供应商和/或者其文档,以确保我们按照供应商预期的方式进行操作。除非它已经证明了自己的身分,否则不要相信我们从别人那里得到的黑匣子。

另一个地方可能是在多个Web请求PDF文件期间发生了什么,我们确定文件不是同时从多个位置写入的吗?例如2-3个请求同时生成PDF?或者PDF生成过程中的2-3页?

最后,我们可能需要检查异常日志,以确保没有任何崩溃/线程退出并使文件句柄保持打开状态而没有引起注意。在多线程方案中,它经常发生,有时线程会崩溃并退出,这可能会发生,特别是如果我们使用第3方组件,它们可能会执行一些魔术,而我们永远不会知道。