瀏覽器緩存是個好東西,可是有些時候,咱們卻又不須要它們,好比當咱們在開發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