2010-05-20 40 views
1

假設一個簡單的aspx數據輸入頁面,其中admin用戶可以上傳圖像以及其他一些數據。它們存儲在數據庫中,下一次管理訪問該頁面以編輯記錄,獲取圖像數據並生成預覽並保存到磁盤(使用GDI +),預覽顯示在圖像控件中。如何強制客戶端瀏覽器從服務器下載圖像而不是使用其緩存

此過程首次正常工作,但如果圖像發生變化(上傳一個新圖像),下一次瀏覽頁面時會顯示之前上傳的圖像。我調試了應用程序,一切正常。新圖像數據在數據庫中,新預覽存儲在臨時位置,但頁面顯示前一個。如果我刷新頁面,它會顯示新的圖像預覽。我應該提到預覽總是以一個名字(每個記錄的ID作爲名字)保存到磁盤。

我認爲這是因爲IE和其他瀏覽器使用客戶端緩存,而不是每次頁面衝浪時加載圖像。我想知道是否有辦法強制客戶端瀏覽器自行刷新,以便在沒有用戶干預的情況下顯示新上傳的圖像。

感謝和讚賞提前,

+0

這些建議是否符合您的需求? – jasonmp85 2010-06-03 10:09:00

回答

3

最簡單的方法就是讓你的應用程序每次上傳新的圖片時間改變圖像的文件名。

也許通過追加日期或日期和時間到圖像文件名的末尾。

或者,你可以嘗試在HTML報頭中設置緩存控制:<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

+0

+1這種方法在過去對我來說很有效。特別是,當發佈新版本的網站與新的圖像。我們在圖片的網址中加入了版本號。在你的情況下,你應該想出一種方法來逐個圖像地增加一個版本。一個可愛的小字符串解析練習可能。需要注意的是,這種方法在CSS樣式表中引用的任何圖像都不能很好地工作,但在這種情況下,這不會影響您。 – 2010-05-20 09:49:28

+0

另一件事。請注意,@ Gilbert的答案是兩部分答案:更改文件名或設置緩存控制。我主張第一部分,改變文件名,但不改變第二部分「NO-CACHE」,因爲後者意味着當圖像沒有改變時,你會失去客戶端緩存的好處。 – 2010-05-20 09:52:28

0

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響應,這很有用。

相關問題