zoukankan      html  css  js  c++  java
  • 阻止xap文件在浏览器中缓存

    浏览器缓存是个好东西,但是有些时候,我们却又不需要它们,比如当我们在开发silverlight应用程序的时候。当你向你的老板或者客户展示你最新修改的程序时,你会发现浏览者缓存给你带来了不好的感受,咦~~?&*…… 怎么和没修改之前没变化,老板和客户看到没变化,当然,你心里清楚,是浏览器缓存搞的鬼,导致没有下载最新的xap文件,但是客户和老板怎么想?这是多么令人尴尬的事情啊~

     
    第一招:彻底根除“祸害”

    怎么办?很简单,每次都手动清理浏览器缓存,清除本地临时文件@#&~~其实我以前也这样做过 。



    第二招:控制“祸害”源头

    通过控制Http头信息,防止浏览器缓存,添加如下相关代码:

     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);

     更详细关于控制浏览器缓存请查看

    http://support.microsoft.com/kb/247404

    但是这样做的结果是什么?它将阻止整个页面的缓存,而我们有时候只是将silverlight应用作为页面的一部分嵌入进去的,所以我们只是将要对silverlight缓存进行限制。于是,出第三招。

    第三招:直捣黄龙

    我们要进行限制的目标是silverlight的缓存,而silverlight其实在运行时都会加载xap文件,其实说到底浏览器是对xap文件进行了缓存,为了使得保证每次都下载到xap文件而不是用缓存的xap文件,给xap文件地址加上一个随机参数,例如下面的样子:

    1 <param name="source" value="ClientBin/MyTest.xap?<%= DateTime.Now.Ticks %>" />

     当然,你可以使用其它获得随机数的方法。但是这样做的话,会使得无论什么时候,都会下载新的xap文件,那么相当于关闭的缓存功能,但是我现在只是想在调式的情况下不使用缓存,在发布后使用缓存,于是,我们可以改进下:

      <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-20

  • 相关阅读:
    django创建表单以及表单数据类型和属性
    Django-debug-toolbar(调试使用)
    POJ 2828 Buy Tickets
    Bsoj 1322 第K小数
    bzoj3555 企鹅QQ
    洛谷P1141 01迷宫
    NOIP2008普及组题解
    NOIP2014 day2 T2 洛谷P2296 寻找道路
    POJ2892 Tunnel Warfare
    BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
  • 原文地址:https://www.cnblogs.com/vimsk/p/2010812.html
Copyright © 2011-2022 走看看