浏览器缓存是一件好事,但有时我们不需要它们,例如,当我们开发它们时silverlight应用程序的时候。当你向老板或客户展示你最新修改的程序时,你会发现浏览器缓存给你带来了不好的感觉,嘿~~?&*…… 如何在没有修改之前没有改变,老板和客户看到没有改变,当然,你知道,是浏览器缓存鬼,导致没有下载最新的xap但是客户和老板怎么想呢?这是多么尴尬啊~
第一步:彻底根除祸害
怎么办?很简单,每次手动清理浏览器缓存,清除当地临时文件@#&~~其实我以前也这样做过。
。
第二招:控制祸害源头
通过控制Http添加以下相关代码,防止浏览器缓存:
1781415<?php16 //php代码17header('Cache-Control:no-cache');18header('Pragma:no-cache');19header('Expires:'.gmdate(DATE_RFC1123,time()-1));20?>2122//C#代码23//Response.AddHeader("Cache-Control","no-cache");24//Response.AddHeader("Pragma","no-cache");25//Response.Expires=-1;2627Response.Cache.SetCacheability(HttpCacheability.NoCache);28Response.Cache.SetNoStore();29Response.Cache.SetExpires(DateTime.MinValue);
关于控制浏览器缓存,请查看更详细信息
http://support.microsoft.com/kb/247404
但结果是什么呢?它会阻止整个页面的缓存,有时我们只是silverlight应用程序作为页面的一部分嵌入,所以我们只是想silverlight限制缓存。所以,第三步。
第三招:直捣黄龙
限制我们的目标是silverlight的缓存,而silverlight事实上,它在运行过程中会被加载xap事实上,归根结底,浏览器是正确的xap缓存文件,以确保每次下载xap文件而不是缓存xap文件,给xap在文件地址上添加一个随机参数,如下图:
1"/>
当然,你可以使用其他方法来获得随机数。但这样做会让你随时下载新的xap文件,那么相当于关闭的缓存功能,但是我现在只是想在调式的情况下不使用缓存,在发布后使用缓存,于是,我们可以改进下:
{
param="";
}else{
param="";
}
Response.Write(param);%>
我们动态构建下载源,使用条件判断句,使用具有随机参数的地址在调式模式下,而不改变。
首先,在调式模式下查看操作程序,然后查看源文件,查看:
看非调模式地址:
可以看出,在非标准模式下,仍然使用无参数地址。到目前为止,我们已经解决了我们一开始提出的问题,现在,还有另一种情况,即当您的程序部署在服务器上时,如何确保发布的应用程序是最新的,而不是缓存。为了解决这个问题,当然,第三步中的第一种方法是:
1"/>
然而,这相当于取消了缓存功能,那么缓存的价值是什么呢?每次下载最近修改的更好的方法应该是xap文件。
通过检查xap文件的创建时间决定是否使用缓存。如果创建时间发生变化,将下载最新修改的文件。如果时间没有变化,将使用最后一个缓存文件:
param="";else{stringxappath=HttpContext.Current.Server.MapPath(@"") @"\" strSourceFile;
DateTimexapCreationDate=System.IO.File.GetLastWriteTime(xappath);
param="";}
Response.Write(param);%>
到目前为止,浏览器缓存带来的一些问题已经得到了很好的解决。 :)
参考文章:http://codeblog.larsholm.net/2010/02/avoid-incorrect-caching-of-silverlight-xap-file/#comment-20