浏览器缓存是个好东西,可是有些时候,咱们却又不须要它们,好比当咱们在开发silverlight应用程序的时候。当你向你的老板或者客户展现你最新修改的程序时,你会发现浏览者缓存给你带来了很差的感觉,咦~~?&*…… 怎么和没修改以前没变化,老板和客户看到没变化,固然,你内心清楚,是浏览器缓存搞的鬼,致使没有下载最新的xap文件,可是客户和老板怎么想?这是多么使人尴尬的事情啊~php
第一招:完全根除“祸害”浏览器
怎么办?很简单,每次都手动清理浏览器缓存,清除本地临时文件@#&~~其实我之前也这样作过
。缓存
第二招:控制“祸害”源头服务器
经过控制Http头信息,防止浏览器缓存,添加以下相关代码:
app
1
<%
2
//
asp jscript代码
3
Response.CacheControl
=
"
no-cache
"
;
4
Response.AddHeader(
"
Pragma
"
,
"
no-cache
"
);
5
Response.Expires
=
-
1
;
6
%>
7
8
<%
9
//
asp vbscript代码
10
Response.CacheControl
=
"
no-cache
"
11
Response.AddHeader
"
Pragma
"
,
"
no-cache
"
12
Response.Expires
=
-
1
13
%>
14
15
<?
php
16
//
php代码
17
header(
'
Cache-Control: no-cache
'
);
18
header(
'
Pragma: no-cache
'
);
19
header(
'
Expires:
'
. gmdate(DATE_RFC1123, time()
-
1
));
20
?>
21
22
//
C#代码
23
//
Response.AddHeader("Cache-Control", "no-cache");
24
//
Response.AddHeader("Pragma", "no-cache");
25
//
Response.Expires = -1;
26
27
Response.Cache.SetCacheability(HttpCacheability.NoCache);
28
Response.Cache.SetNoStore();
29
Response.Cache.SetExpires(DateTime.MinValue);
更详细关于控制浏览器缓存请查看spa
http://support.microsoft.com/kb/247404
可是这样作的结果是什么?它将阻止整个页面的缓存,而咱们有时候只是将silverlight应用做为页面的一部分嵌入进去的,因此咱们只是将要对silverlight缓存进行限制。因而,出第三招。
第三招:直捣黄龙
咱们要进行限制的目标是silverlight的缓存,而silverlight其实在运行时都会加载xap文件,其实说到底浏览器是对xap文件进行了缓存,为了使得保证每次都下载到xap文件而不是用缓存的xap文件,给xap文件地址加上一个随机参数,例以下面的样子:
.net
1
<
param name
=
"
source
"
value
=
"
ClientBin/MyTest.xap?<%= DateTime.Now.Ticks %>
"
/>
固然,你可使用其它得到随机数的方法。可是这样作的话,会使得不管何时,都会下载新的xap文件,那么至关于关闭的缓存功能,可是我如今只是想在调式的状况下不使用缓存,在发布后使用缓存,因而,咱们能够改进下:
code
<
object
data
="data:application/x-silverlight-2,"
type
="application/x-silverlight-2"
width
="100%"
height
="100%"
>
<!--
<param name="source" value="ClientBin/SilverlightTest1.xap"/>
-->
<%
string
strSourceFile
=
@
"
ClientBin/SilverlightTest1.xap
"
;
string
param;
if
(System.Diagnostics.Debugger.IsAttached)
{
param
=
"
<param name=\
"
source
\
"
value=\"" + strSourceFile +
"
?
"
+ DateTime.Now.Ticks +
"
\
"
/>
"
;
}
else
{
param
=
"
<param name=\
"
source
\
"
value=\"" + strSourceFile +
"
\
"
/>
"
;
}
Response.Write(param);
%>
<
param
name
="onError"
value
="onSilverlightError"
/>
<
param
name
="background"
value
="white"
/>
<
param
name
="minRuntimeVersion"
value
="4.0.50826.0"
/>
<
param
name
="autoUpgrade"
value
="true"
/>
咱们动态的构造下载源,并使用一个条件判断语句,使得在调式模式下使用带有随机参数的地址,而在非调式模式下,不作改变。
首先,看一下在调式模式下运行程序,而后咱们查看源文件,看下:
再看下非调式模式地址:
能够看到,在非调式模式下,仍是使用无参数的地址。到此,咱们已经解决了开始咱们提出的问题,如今,又出现了另外一种状况,那就是当你的程序部署到服务器上的时候,如何保证发布的应用程序是最新的,而不是缓存的。要解决这个问题,固然可使用第三招中的第一个方法:
1 <param name="source" value="ClientBin/MyTest.xap?<%= DateTime.Now.Ticks %>" />
可是,这样作等于取消了缓存功能,那么缓存的价值何在?更好的方法应该是每次都下载最近修改的xap文件。
经过检查xap文件的建立时间,来决定是否使用缓存,若是建立时间改变,那么将下载最近修改的文件,若是时间没变,将使用上次的缓存文件:
<%
string
strSourceFile
=
@
"
ClientBin/MyTest.xap
"
;
string
param;
if
(System.Diagnostics.Debugger.IsAttached)
param
=
"
<param name=\
"
source
\
"
value=\"" + strSourceFile +
"
\
"
/>
"
;
else
{
string
xappath
=
HttpContext.Current.Server.MapPath(@
""
)
+
@
"
\
"
+
strSourceFile;
DateTime xapCreationDate
=
System.IO.File.GetLastWriteTime(xappath);
param
=
"
<param name=\
"
source
\
"
value=\"" + strSourceFile +
"
?ignore
=
"
+
xapCreationDate.ToString()
+
"
\
"
/>
"
;
}
Response.Write(param);
%>
至此,已经能够很好的解决了浏览器缓存带来的一些问题。 :)
参考文章:http://codeblog.larsholm.net/2010/02/avoid-incorrect-caching-of-silverlight-xap-file/#comment-20blog