2014-03-03 100 views
0

我有一個控制器,它有一個函數將返回一個文件。該文件作爲臨時文件在服務器上生成,然後通過HttpResponseMessage進行流式傳輸。我想要做的是在完成發送後刪除文件(也許將來我們可能會保留它們一段時間,以防再次發出完全相同的請求)。我有這樣的事情:返回文件流 - 如何知道它什麼時候完成

[HttpGet] 
    public HttpResponseMessage GetReport() 
    { 
     string fileName = //function that creates the file and returns the filename... 
     HttpResponseMessage response = new HttpResponseMessage(); 
     response.Content = new StreamContent(new FileStream(fileName, FileMode.Open, FileAccess.Read)); 
     response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
     response.Content.Headers.ContentDisposition.FileName = "test.docx"; 

     //File.Delete(fileName); 
     return response; 
    } 

我不能刪除上面註釋掉的文件,因爲這個文件正在使用。那麼是否有一個事件或一旦流完成發送後會被觸發,所以我可以處理刪除?

當然,我可以開始一個任務,等待一段時間然後刪除,但這看起來有點不可思議。

+0

我建議你創建一個方法,接收文件句柄或其他方式來識別文件,要做到這一點,而且這種方法將在客戶端被調用時,它會是好的刪除文件 –

+0

@RicardoAppleton:我聽到你在說什麼,但是這留給了客戶端,這也使得我可以通過請求一大堆文件而不用發送刪除消息來使服務器崩潰,直到磁盤用完空間。當然,我仍然需要控制。 –

回答

1

因爲您提到將文件保留一段時間(可能),您將需要某種過期體系結構。創建一個跟蹤這些臨時文件系統對象以及過期時間戳的數據庫表。然後,使用Windows任務計劃程序或類似Quartz.NET的庫來創建計劃任務,以定期查詢已過期的對象並將其刪除。

我在我自己的項目中執行此操作,以清理用戶上傳的文件,但由於用戶取消了包含過程,因此未必使用這些文件。

棘手的部分是定義什麼構成了成功的迴應。響應是否成功是因爲客戶收到所有數據並對其採取行動?如果是這樣,那麼只有客戶端具有確定數據是否成功接收所需的全部信息。在這種情況下,客戶端可能會告訴服務器它(客戶端)收到數據並對其執行操作。然後,服務器可以立即刪除文件,也可以在前面提到的架構中將其標記爲過期。

1

HttpResponseMessage是一次性的,我的建議是定義從HttpResponseMessage派生的類,並覆蓋Dispose(bool disposing)清理文件的方法。

class FileResponseMessage : HttpResponseMessage 
{ 
    public string FileResponseMessage(string fileName) 
    { 
     this.Content = new StreamContent(new FileStream(fileName, FileMode.Open, FileAccess.Read)); 
     this.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
     this.Content.Headers.ContentDisposition.FileName = "test.docx"; 
    } 

    override void Dispose(bool disposing) 
    { 
     if(disposing) 
     { 
      //your cleanup 
     } 
    } 
} 
+0

這不是一個合適的解決方案。無論響應是否成功發送,都會處理FileResponseMessage。很可能,提交者只希望在成功發送文件時將其刪除。 – NathanAldenSr

+0

當您在HttpResponseMessage上調用dispose時,它也會調用下層流。比處置HttpResponseMessage之後,流未被使用。 – Aik

相關問題