2011-05-30 36 views
1

我有一個HTTP處理程序設置,它接受一個GUID參數並從文件系統返回圖像。在HTTP處理程序中,如果知道內容不會更改,是否可以返回304?

這張圖片不會改變;如果有的話,後端程序會生成一個新的GUID。因此,我希望圖像總是被緩存。

是否正確的方式來從HTTP處理程序設置狀態碼304(未修改)?

+0

請看http://stackoverflow.com/questions/1109768/how -to-use-output-cache-on-ashx-handler和http://stackoverflow.com/questions/1775448/asp-net-cache-setcacheabilityhttpcacheability-public-not-setting-header – 2011-05-30 12:17:06

回答

2

我會建議您爲了在設置適當的HTTP響應頭,以指示客戶端的內容不會改變,並且可以緩存:

public void ProcessRequest(HttpContext context) 
{ 
    var cache = context.Response.Cache; 
    cache.SetCacheability(HttpCacheability.Public); 
    cache.SetExpires(DateTime.Now.Add(CACHE_DURATION)); 
    cache.SetMaxAge(CACHE_DURATION); 
    cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 

    byte[] buffer = ... 
    context.Response.ContentType = "image/png"; 
    context.Response.OutputStream.Write(buffer, 0, buffer.Length); 
} 
+0

我已經實現了代碼,但我在我的httphandler的瀏覽器中,狀態仍然爲200(而不是304)。我在這裏錯過了什麼? – 2016-02-16 10:10:20

2

是。但是,只有當請求是有條件的請求時,您才應返回HTTP/304。如果您知道該網址的圖片永遠不會更改,您可以設置很長的到期日期(根據規格,1年是最大的)。

順便說一下,RFC 2616是很容易閱讀 - 我建議看看那裏,進一步的細節。

0

另外@達林的迴應,你有沒有遇到過ETags?這些是像您提出的那樣實現緩存的常用方法之一。瀏覽器第一次請求圖片時,您不會有ETag,因此您知道要提供圖片。下一次發出請求時,它將提供ETag - 然後可以使用它來查看是否返回304或圖像本身。在你的例子中,你只會檢查是否存在ETag。

與您提出的解決方案是什麼會關心我的是你如何識別從後續請求的第一個請求(以及從多個客戶端)

相關問題