2015-04-28 71 views
1

我剛剛發現部分響應在我們的客戶機器中被緩存爲完整的,導致整個網站無法使用。我完全不知道,那裏有什麼可能出錯的。Firefox存儲緩存不完整響應

那麼在下面的設置中可能會出錯?

在服務器端,我們有一個ASP.NET應用程序在運行。一個IHttpHandler處理對JavaScript文件的請求。它基本上是在請求時縮小文件的大小,並將結果寫入響應流。但是它也記錄該字符串的長度被寫入到Response插播:

String javascript = /* Javascript is retrieved here */; 
HttpResponse response = context.Response; 
response.ContentEncoding = Encoding.UTF8; 
response.ContentType = "application/javascript"; 
HttpCachePolicy cache = response.Cache; 
cache.SetCacheability(HttpCacheability.Public); 
cache.SetMaxAge(TimeSpan.FromDays(300)); 
cache.SetETag(ETag); 
cache.SetExpires(DateTime.Now.AddDays(300)); 
cache.SetLastModified(LastModified); 
cache.SetRevalidation(HttpCacheRevalidation.None); 
response.Headers.Add("Vary", "Accept-Encoding"); 
Log.Info("{0} characters sent", javascript.length); 
response.Write(javascript); 
response.Flush(); 
response.End(); 

內容然後通常使用gzip編碼與傳輸編碼分塊發送。對我來說似乎很簡單。

不幸的是,我剛剛和一個用戶進行了遠程會話,其中只有大約1/3的文件在緩存中,當然打破了文件(15k而不是44k)。在緩存中,內容編碼也設置爲gzip,所有通信都通過https進行。

在用戶機器上打開源文件後,我只需按Ctrl-F5,即可立即顯示完整內容。

什麼可能會出錯?

如果它的事項,請找緩存條目從下面的Firefox:

Cache entry information 
key: <resource-url> 
fetch count: 49 
last fetched: 2015-04-28 15:31:35 
last modified: 2015-04-27 15:29:13 
expires: 2016-02-09 14:27:05 
Data size: 15998 B 
Security: This is a secure document. 
security-info: (...) 
request-method:  GET 
request-Accept-Encoding: gzip, deflate 
response-head: HTTP/1.1 200 OK 
Cache-Control: public, max-age=25920000 
Content-Type: application/javascript; charset=utf-8 
Content-Encoding: gzip 
Expires: Tue, 09 Feb 2016 14:27:12 GMT 
Last-Modified: Tue, 02 Jan 2001 11:00:00 GMT 
Etag: W/"0" 
Vary: Accept-Encoding 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
Date: Wed, 15 Apr 2015 13:27:12 GMT 
necko:classified: 1 
+0

更新:經過一段時間,我放棄了。縮小的js文件現在以唯一的名稱寫入文件系統,並由IIS直接提供。這個問題從那以後就沒有發生過。 – Andreas

回答

0

你的客戶的瀏覽器是最有可能緩存JavaScript文件,這將意味着你的腳本的src沒有改變。

舉例來說,如果你要申請myScripts

<script src="/myScripts.js"> 

然後在第一時間,客戶端將請求文件和任何進一步的時代,瀏覽器將讀取緩存。

您需要在腳本末尾附加某種獨特的值,例如時間戳,因此即使瀏覽器緩存文件,新的時間戳也會像新文件名一樣起作用。

客戶按Ctrl + F5,因爲這是一條捷徑清空瀏覽器緩存後接收新的腳本。

MVC有一個非常好的方法來做到這一點,其中包括追加一個唯一的代碼,每次應用程序或應用程序池重新啓動時更改。檢出MVC Bundling and Minification

希望這會有所幫助!

+0

我已經完成了所有版本控制:對於特定的URL,服務器將始終返回相同的JavaScript。如果Javascript改變,腳本標籤中的src也會改變。但不幸的是,客戶端仍然只緩存了實際內容的三分之一(內容僅停留在字符串的中間,導致引號打開)。 – Andreas