我的web應用程序生成PDF文件並通過電子郵件或傳真將它們發送給我們的客戶。不知何故,IIS6保留了該文件,並阻止了任何其他請求聲明舊的'..該進程無法訪問該文件'xxx.pdf',因爲它正在被另一個進程使用。'IIS保留我生成的文件
當我回收應用程序池時,一切正常。有人知道爲什麼會發生這種情況,我該如何阻止它。
感謝
我的web應用程序生成PDF文件並通過電子郵件或傳真將它們發送給我們的客戶。不知何故,IIS6保留了該文件,並阻止了任何其他請求聲明舊的'..該進程無法訪問該文件'xxx.pdf',因爲它正在被另一個進程使用。'IIS保留我生成的文件
當我回收應用程序池時,一切正常。有人知道爲什麼會發生這種情況,我該如何阻止它。
感謝
正如大家說,不要叫Close
和Dispose
方法在任何IO對象讀/寫的PDF文件時,你必須打開。
但我想你已經加入了一個第三方組件?爲你寫的PDF文件?如果出現這種情況,您可能需要與供應商和/或其文檔進行覈對,以確保您按照供應商希望的方式進行操作。不要相信從別人那裏得到的黑盒子,除非它已經證明了自己。
另一個看點可能是在對PDF文件的多個Web請求期間發生了什麼,您確定該文件不是從多個位置同時寫入的嗎?例如2-3請求同時創建PDF?或PDF生成過程中的2-3頁?
最後,您可能需要檢查異常日誌以確保沒有任何事件正在崩潰/線程退出,並且在您沒有注意到的情況下保持文件句柄處於打開狀態。在多線程場景中會發生很多事情,有時線程會崩潰並退出 - 這可能會發生,尤其是在您使用第三方組件時,它們可能會執行一些技巧,這是您永遠不會知道的。
我想看看你的代碼,並確保所有手柄打開(生成)文件已正確關閉。有時你不能依靠垃圾收集器來排序這些東西。
聽起來像,文件 - 在創建後 - 仍然被工作進程鎖定。確保關閉文件的所有連接。 (請記住,使用blocks'll照顧)
檢查磁盤上的所有代碼寫入文件是否正確關閉每個句柄,使用finally子句中的.Close()或通過「using」子句C#
byte[] asciiBytes = getPdf(...);
try{
BinaryWriter bw = new BinaryWriter(File.Create(filename));
bw.Write(pdfBytes);
}
finally {
if(null != bw)
bw.Close();
}
使用Response和內容處置條款的文件
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=" + PDID + ".pdf");
Response.WriteFile(filename);
Response.Flush();
發送
顯示的代碼創建和PDF文件從大約18個月發送給客戶,我們從來沒有見過一個文件鎖定。
和前面提到的一樣:注意關閉所有打開的處理程序。
有時Microsoft的索引服務會阻止文件。排除目錄