【发布时间】:2010-09-09 11:24:20
【问题描述】:
我的网络应用程序生成 pdf 文件,然后通过电子邮件或传真将它们发送给我们的客户。 IIS6 以某种方式保留该文件并阻止任何其他声称旧的“..进程无法访问文件”xxx.pdf,因为它正被另一个进程使用。”
当我回收应用程序池时,一切正常。有谁知道为什么会发生这种情况以及我该如何阻止它。
谢谢
【问题讨论】:
我的网络应用程序生成 pdf 文件,然后通过电子邮件或传真将它们发送给我们的客户。 IIS6 以某种方式保留该文件并阻止任何其他声称旧的“..进程无法访问文件”xxx.pdf,因为它正被另一个进程使用。”
当我回收应用程序池时,一切正常。有谁知道为什么会发生这种情况以及我该如何阻止它。
谢谢
【问题讨论】:
我会查看您的代码并确保打开(生成)文件的所有句柄都已正确关闭。有时你不能依靠垃圾收集器来解决这些问题。
【讨论】:
听起来,文件 - 在创建后 - 仍被工作进程锁定。确保关闭文件的所有连接。 (记住,使用 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 的索引服务会阻止文件。排除您的目录
【讨论】:
正如大家所说,在读取/写入 PDF 文件时,请对您打开的任何 IO 对象调用 Close 和 Dispose 方法。
但我想你已经合并了一个 第三方组件? 来为你编写 PDF?如果是这种情况,您可能需要与供应商和/或其文档进行核对,以确保您按照供应商预期的方式做事。不要相信你从别人那里得到的黑匣子,除非它已经证明了自己。
另一个地方可能是在对 PDF 文件进行多个 Web 请求期间会发生什么,您确定该文件不是从多个地方同时写入的吗?例如2-3 个请求同时生成 PDF?还是 PDF 生成过程中的 2-3 页?
最后,您可能需要检查异常日志以确保没有发生崩溃/线程退出并在您没有注意到的情况下打开文件句柄。它在多线程场景中经常发生,有时线程只是崩溃并退出 - 这可能会发生,特别是如果您使用 3rd 方组件,它们可能正在执行一些你永远不会知道的魔术技巧。
【讨论】: