簡體   English   中英

如何處理ASP.NET中的臨時文件?

[英]How to deal with temporary files in ASP.NET?

請注意,我不是在談論編譯器生成的“臨時ASP.NET文件”。

我的Web應用程序(ASP.NET MVC)使用Graphviz生成圖像,然后將其提供給客戶端。 這需要創建臨時文件。

處理這些問題的最佳方法是什么? 有沒有辦法在發送后立即刪除它們? 我應該使用后台線程嗎? Application_Start或Application_End中的東西?

Graphviz創建客戶端,並將它們添加為頁面中的鏈接。 所以你不能直接刪除它們。

有幾種方法:

  • 在應用程序啟動時,沒有人應該使用其中一個圖像。 所以你可以刪除它
  • 您將圖像的引用(例如路徑)添加到緩存,並添加一個CacheItemRemovedCallback,它將刪除您的圖像。 (很好地限制了你的高清圖像數量
  • 制作一個定時器,定期刪除項目

請注意,您不應該刪除僅在一秒鍾之前創建的圖像。 由於它們可以使用。

你不能通過控制器或使用ASHX( http://www.marklio.com/marklio/CommentView,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx )流出內容並刪除完成寫出流后的臨時文件?

使用其他用戶描述的方法但是如果想要圖像再次通過在響應中設置Last-Modifed標頭然后在圖像處理程序中獲得If-Modified-Since標頭,則要求瀏覽器使用其緩存,處理程序應該回復使用StatusCode 304“NOT Modified”,只要客戶端瀏覽器尚未清除其緩存,圖像仍會顯示。

我喜歡在生成它們的同一個動作中處理由動作創建的臨時文件。 例如:(在MVC中,但這適用於任何框架)

public ActionResult Foo()
{
    FooCleanup(); // deletes files in "~/temp/Foo/" older than a day or so

    string filename = CreateTemporaryFile(); // Creates a temporary file like "~/temp/Foo/{timestamp}.foo"
    return File(filename);
}

如果Foo()被大量調用,你可以添加一些邏輯,只是經常調用cleanup。 這有點像窮人的cron工作,但效果很好。

您可以創建一個處理程序(.ashx)並通過它傳輸臨時文件。 這樣您就會知道該文件已經轉移到客戶端,您可以刪除處理程序末尾的臨時文件。

可能的問題是客戶端將無法下載文件兩次,因為您要立即刪除它。 (然后可以使用頁面輸出緩存來緩解...)

雖然最好的辦法就是如果你可以完全避免臨時文件問題 ,並根據請求流出文件,通過在處理程序中生成它...

我們使用帶有計時器類型的application_start以每24小時的間隔運行,並每天清理/刪除臨時文件文件夾一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM