簡體   English   中英

Internet Explorer/Firefox 中的硬刷新和 XMLHttpRequest 緩存

[英]Hard refresh and XMLHttpRequest caching in Internet Explorer/Firefox

我發出了一個 Ajax 請求,在該請求中設置了響應可緩存性和最后修改的標頭:

if (!String.IsNullOrEmpty(HttpContext.Current.Request.Headers["If-Modified-Since"]))
{
    HttpContext.Current.Response.StatusCode = 304;
    HttpContext.Current.Response.StatusDescription = "Not Modified";
    return null;
}
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
HttpContext.Current.Response.Cache.SetLastModified(DateTime.UtcNow);

這按預期工作。 我第一次提出 Ajax 請求時,我得到200 OK 我第二次得到304 Not Modified

當我在 Chrome (Ctrl+F5) 中硬刷新時,我得到200 OK - 太棒了!

當我在 Internet Explorer/Firefox 中硬刷新時,我得到304 Not Modified 但是,所有其他資源 (JS/CSS/HTML/PNG) 都會返回200 OK

原因是“如果未修改”header 是針對 XMLHttpRequest 發送的,無論這些瀏覽器中的硬刷新如何。 我相信 Steve Souders在這里記錄了它。

我嘗試設置一個 ETag 並在“If-None-Match”上進行調節,但無濟於事(Steve Souders 頁面的評論中提到了這一點)。

有沒有人在這里得到任何智慧的寶石?

謝謝,本

更新

我可以對照存儲的最后修改日期檢查“If-Modified-Since”。 但是,希望這個問題能幫助其他發現 header 設置不正確的 SO 用戶。

更新 2

雖然每次都使用“If-Modified-Since”header 發送請求。 如果到期未設置或設置為未來日期,Internet Explorer 甚至不會發出請求。 無用!

更新 3

這還不如現在是一個實時博客。 Internet Explorer 不會在 localhost 時發出第二個請求。 使用真正的 IP 或環回將起作用。

在 IE10 之前,IE 不應用刷新標志(請參閱http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the -refresh-button.aspx ) 對不是作為加載文檔的一部分進行的請求。

如果需要,您可以調整目標 URL 以包含隨機數,以防止緩存副本滿足未來的請求。 或者,您可以發送 max-age=0 以強制 IE 在每次重用之前有條件地重新驗證資源。

至於為什么瀏覽器會復用一個沒有指定生命周期的緩存資源,請看http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer -9.aspx

我為實現一致控制而遇到的解決方案是管理所有請求類型的緩存標頭。

因此,我強制標准請求與 XMLHttpRequests 相同,它告訴 IE 使用以下緩存策略:Cache-Control: private, max-age=0。

出於某種原因,IE 不尊重各種請求類型的標頭。 例如,我對標准請求的緩存策略默認為瀏覽器,而對於 XMLHttpRequests,它被設置為上述控制策略。 但是,將 /url 之類的請求作為標准獲取請求,可以正確呈現結果。 不幸的是,向 /url 發出與 XMLHttpRequest 相同的請求,甚至不會到達服務器,因為獲取請求已被緩存並且 XMLHttpRequest 正在訪問相同的 Z572D4E421E5E6B9BC11D815E8A027112。

因此,要么在所有方面強制您的緩存策略,要么確保您對請求類型使用不同的訪問點 (uri)。 我的解決方案是前者。

暫無
暫無

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

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