我的 Web 应用程序生成 pdf 文件,然后通过电子邮件或传真将它们发送给我们的客户。IIS6 以某种方式保留该文件并阻止任何其他声称旧的“..进程无法访问文件”xxx.pdf,因为它正被另一个进程使用。
当我回收应用程序池时一切正常。有谁知道为什么会发生这种情况,我该如何阻止它。
谢谢
正如大家所说,在读取/写入 PDF 文件时,请在打开的任何 IO 对象上调用Close
and方法。Dispose
But I suppose you'd incorporated a 3rd party component? to do the PDF writing for you? If that's the case you might want to check with the vendor and/or its documentation to make sure that you are doing things in the way the vendors intended them to be. Don't trust the black box you got from someone else unless it has proven itself.
Another place to look might be what happens during multiple web request to the PDF files, are you sure that the file is not written simultaneously from multiple places? e.g. 2-3 requests genrating PDF simultaneously? or 2-3 pages along the PDF generation process?
最后,您可能需要检查异常日志以确保没有发生崩溃/线程退出并在您没有注意到的情况下保持文件句柄打开。它在多线程场景中经常发生,有时线程只是崩溃并退出 - 这可能会发生,特别是如果您使用 3rd 方组件,它们可能正在执行一些魔术,您永远不会知道。
听起来,文件 - 在创建后 - 仍然被工作进程锁定。确保关闭文件的所有连接。(请记住,使用 using 块会解决这个问题)
我会查看您的代码并确保打开(生成)文件的所有句柄都已正确关闭。有时你不能依靠垃圾收集器来整理这些东西。
使用 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 的索引服务会阻止文件。排除您的目录