2014-07-15 46 views
3

我試圖實現我稱之爲「一次性緩存」的特定文件在我的ASP.NET 3.5站點中。根據請求,文件從遠程文件服務器下載到Web服務器上,然後由我的頁面提供。當我去刪除它時,問題就出現了。如果我刪除OnUnload方法中的文件,客戶端沒有時間檢索它。是否有某種方式檢測文件的下載並在第一次訪問後立即刪除它?我的代碼是這樣的:ASP.NET「一次性緩存」文件

private bool _deleteFlag = false; 
    private string _deleteFile = string.Empty; 

    protected void Page_Load(object sender, EventArgs e) { 
     if (!string.IsNullOrEmpty(Request.QueryString["file"])) { 
      _deleteFlag = Request.QueryString["file"].Contains(@"cache/"); 
      _deleteFile = Request.QueryString["file"]; 
     } 
    } 

    protected override void OnUnload(EventArgs e) { 
     if (_deleteFlag) { 
      // Can't delete here; the client is still trying to retrieve it. 
      System.IO.File.Delete(Server.MapPath(_deleteFile)); 
     } 
     base.OnUnload(e); 
    } 

我傾向於寫一個IHttpHandler重寫文件請求,但感覺就像矯枉過正。

+0

如果您有IIS訪問你可以試試這個[SO鏈接] [1] [1]:http://stackoverflow.com/questions/ 2195266/how-to-configure-static-content-cache-per-folder-and-extension-in-iis7 – karthick

+0

@karthick,這看起來很有希望。但它會導致IIS *刪除*我的文件,還是我需要爲自己設計一個機制? –

回答

2

試試這個:

當你把你的文件,將其插入到HttpRuntimeCache,並設置關鍵的FileName和設置超時說10秒。然後在CacheItemRemoved回調上刪除該文件。這不是確切的,但它應該大致滿足您的使用情況。

public static object LoadFile() 
{ 
    var filename = ParseFileNameFromHttpRequest(); 

    var a = loadFileSomeHow(filename); 

    HttpRuntime.Cache.Insert(
     filename , 
     a, 
     null, 
     System.Web.Caching.Cache.NoAbsoluteExpiration, 
     new TimeSpan(0, 0, 0,10,0,0), 
     CacheItemPriority.Default, 
     new CacheItemRemovedCallback(DeleteFile)); 

    return a; 
} 

public void DeleteFile(String key, object value, 
    CacheItemRemovedReason removedReason) 
{ 
    File.Delete(key); 
} 

欲瞭解更多信息:http://msdn.microsoft.com/en-us/library/vstudio/7kxdx246(v=vs.100).aspx

+1

這很好用!謝謝!作爲一個方面說明,(至少在我的情況下),沒有必要將文件本身放入緩存;我只是把文件名放到key *和* value字段中,回調處理剩下的部分。 –

+1

非常好聽!根據您的平臺,如果這是一個有效的用例,您可能需要對其進行測試,並確保它仍能在高負載下工作。 –