阻止xap文件在瀏覽器中緩存

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

相關文章
相關標籤/搜索