IIS保留了我生成的文件
我的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方组件,它们可能会执行一些魔术,而我们永远不会知道。