最近,我在客戶的地方託管了一個網站(使用ASP.Net開發),其中包含許多用於Rich UI交互的JavaScript內容。一切工作正常。但主要的問題是 -
當我在JavaScript文件中做了一些更改並上傳它,它不會在客戶端的地方生效,因爲有網站需要本地緩存的JavaScript文件。
那麼,我該如何避免這種情況?
有沒有什麼技術可以解決我的問題?
最近,我在客戶的地方託管了一個網站(使用ASP.Net開發),其中包含許多用於Rich UI交互的JavaScript內容。一切工作正常。但主要的問題是 -
當我在JavaScript文件中做了一些更改並上傳它,它不會在客戶端的地方生效,因爲有網站需要本地緩存的JavaScript文件。
那麼,我該如何避免這種情況?
有沒有什麼技術可以解決我的問題?
有一些技術可以避免瀏覽器使用緩存過期來緩存資源。
protected void Application_BeginRequest()
{
//NOTE: Stopping IE from being a caching whore
HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetValidUntilExpires(true);
}
但對於你的情況,這是不可取的,我認爲你的項目仍處於開發階段,只是避免cntrl + F5
通過資源的重新加載和緩存資源被刪除並重新加載再次,你不應該執行這一補救措施因爲這會降低你的網站性能。
更簡單和更合理的解決方案是告訴您的客戶合作,並在需要查看最近網站變化時按cntrl + F5
,此後當網站完成時,不需要再做任何操作,或者您可以在開發階段僅實現以上給定的代碼,並在使您的網站生效之前將其刪除。
了一些研究之後,我們來到了頭的下面的列表,似乎涵蓋了大部分的瀏覽器:
在ASP.NET我們添加了這些使用下面的代碼片段:
Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0
從實測:http://forums.asp.net/t/1013531.aspx
他說問題是服務器緩存,而不是客戶端緩存。我再次看到這一點(ftp上傳是可以的,ftp下載得到的是正確的文件,但http只是檢索舊版本,僅用於'.js'文件) – 6502 2012-07-28 05:37:08
追加一些隨機生成的數字/時間戳在URL的JS文件的末尾像 -
見備註在這個答案reagarding緩存:的 Making a show/hide smaller
思考緩存爲你的朋友。
代替具有隻是script
標記加載的Javascript,將其加載動態
<script>
function loadScript(name) {
var s = document.createElement("script");
s.src = name + "?" + (new Date).getTime();
document.body.appendChild(s);
}
loadScript("script1");
loadScript("script2");
</script>
CTRL + F5是不能接受的,先生。 – Julian 2012-07-28 05:44:31
這只是一個建議,上面給出的代碼可以替代地使用。 – yogi 2012-07-28 05:46:59