The HTTP Spec包含用於傳達關於資源的「可緩存」,以客戶的各種信息標題。維基百科也有一個很好的總結here。
基本上,當一臺服務器向客戶端傳遞一些資源時,它會附帶各種元數據。基於這個元數據,客戶決定是否緩存資源,如果是,緩存多久。
你可以用各種方式解決你的問題。最簡單的方法可能是始終將圖像響應中的Expires
標題設置爲1970年1月1日的值(Unix Epoch)。這將告訴客戶端在1970年過期緩存條目。由於它總是在1970年以後,客戶端永遠不會緩存資源並且總是要求一個新的副本。
這種方法確實有其不足之處,即如果圖像永不改變,您不必要地承擔額外的帶寬和服務器上的負載。這就是ETag和LastModified標頭進來的地方。
服務器可以計算每個資源的短散列。假設一個圖像的哈希值爲a423fedc
。客戶端將存儲此散列,並在第二次請求資源時,使用If-None-Match
請求標頭將其提供給服務器。如果服務器計算出該資源的ETag未更改,則它只會發送一個304 Not Modified
,客戶端可以使用該緩存版本。 ETags進一步解釋here。
但我認爲你的情況最好的解決方案是Last-Modified
標題。服務器將發送與上次修改圖像相對應的日期。在重新加載頁面後,客戶端將此日期作爲If-Modified-Since
標題的一部分發回。如果自該日期以後該圖像已被修改,則服務器將發送更新的圖像。如果沒有,則發回304 Not Modified
代碼。
我不是ASP開發人員,所以我不能告訴你如何在你的響應中設置這些標題,但如果你能弄明白,每個瀏覽器都會正確地進行緩存。我確實找到this article,看起來它可以告訴你如何在ASP-land中做到這一點,但只是知道標題應該足以讓你開始。
對於調試,最好使用Firebug插件等Firefox瀏覽器進行測試。它可以向您顯示您的請求和回覆中的標題,以便您知道實際上正在通過的線路。如果您使用的是緩存版本,或者服務器沒有返回新數據,您實際上會在Firebug中看到304響應,這很有用。
這些建議是否符合您的需求? – jasonmp85 2010-06-03 10:09:00