2011-06-11 48 views
2

我得到一個「該進程無法訪問該文件」,因爲它正在被另一個進程使用。「我們的上傳處理程序錯誤。我們正在測試的是通過silverlight的上傳器,它將數據以塊的形式發送到服務器上的處理程序。一切工作正常,直到我們測試中斷互聯網連接,然後重新啓用互聯網連接(上傳者的目的是在互聯網恢復時自動恢復)。當處理程序試圖在互聯網連接恢復後重新打開文件時,出現錯誤(「進程無法訪問文件」)。似乎並沒有釋放文件鎖定爲

即具有問題的代碼是下面

using (FileStream fs = File.Open(context.Server.MapPath("~/Uploads/") + uploadGuidAsString, FileMode.CreateNew, FileAccess.Write, FileShare.None)) 
{ 

    SaveFile(context.Request.InputStream, fs); 
    fs.Flush(); 

} 

回答

1

TCP套接字只能檢測一個斷開的連接時實際上正在通過連接發送的數據。當你的上傳者的連接關閉時,沒有更多的數據從遠端發送。由於你的服務器沒有向上傳器發送任何數據,服務器只是等待,期待更多的數據最終從上傳器客戶端到達。

我建議你給每個上傳者一個唯一的ID。如果您看到來自上傳者的第二次連接嘗試,請手動終止第一個連接。

0

您需要一個唯一標識上傳會話和可以允許上載恢復的協議的標識(GUID?)。在重新連接時,上傳者可以發送該ID並且在它希望恢復的文件的偏移量中。然後,服務器可以使用該ID來查找處理該上傳的類實例,並且像Dark Falcon所建議的那樣,只需關閉「舊」連接,根據請求移動文件指針,然後在新連接上恢復流式傳輸/分塊。我想你會需要一些超時在服務器上刪除過時的上傳會話對象。您的協議可能需要處理這個問題 - 如果客戶端在上傳會話實例超時並釋放後請求恢復,會發生什麼情況?

RGDS, 馬丁

+0

你會如何建議關閉舊連接? – 2011-06-13 17:03:08