2019独角兽企业重金招聘Python工程师标准>>>

浏览器缓存是个好东西,但是有些时候,我们却又不需要它们,比如当我们在开发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

转载于:https://my.oschina.net/u/1446855/blog/643512

阻止xap文件在浏览器中缓存相关推荐

  1. 11.4.2 在照片浏览器中缓存值

    11.4.2 在照片浏览器中缓存值 下面的示例,我们将写一个应用程序,找出指定文件夹中所有照片,并以列表形式显示:当用户选择一张照片,应用程序调整大小,在窗口中显示.(为了简便起见,我们不会允许用户调 ...

  2. Java后台实现pdf文件在浏览器中预览

    Java后台实现pdf文件在浏览器中预览 放在服务器的pdf文件不能通过完整路径访问,想要实现的效果是浏览器访问后台接口可以预览pdf文件,暂时是把pdf文件放在本地测试 通过输出流的方式将pdf文件 ...

  3. Sublime Text 3 快捷实现文件在浏览器中打开

    Sublime Text 3代码编辑器   问题:Sublime Text 3编写文件无法使用快捷键在浏览器中查看? 解决方法一:通过Sublime Text 3安装View In Browser插件 ...

  4. linux浏览器不能播放音频文件夹,在html中插入音频文件在浏览器中播放音频文件的兼容性问题...

    下面谈谈本人在html中插入音频文件,经过我的本地测试总结的一些问题(播放mp3文件): 1. 问题:IE8上正常(通过media player插件来播放)但在IE6和IE7上不会播放 Firefox ...

  5. adobe reader java_请问,如何用JAVA读PDF文件在浏览器中显示,不需要在本地系统中安装Adobe Reader。求java代码...

    JAVA读PDF可以实现,重点是如何在网页中显示PDF文件,而且不需要安装AdobeReader.没有安装AdobeReader,在网页显示PDF文件时,浏览器会提示下载.请问如何在网页中显示PDF文 ...

  6. html设置阻止网页在google浏览器中打开时弹出自动翻译框

    想要阻止网页打开时弹出上面的翻译窗口,有两种设置方式: 1.(建议)在html文件的head标签中添加meta标签: <meta name="google" content= ...

  7. 前后端分离情况下pdf文件在浏览器中预览的实现

    在浏览器上直接打开pdf文件,页面标题与文件不符,经如下处理,问题得到解决: 1.Vue文件发送请求 window.open(HOST + '/file/preview/' + this.userId ...

  8. Sublime text 设置快捷键让html文件在浏览器中打开

    1.安装View In Browser插件 快捷键 Ctrl+Shift+P(菜单栏Tools->Command Paletter),输入 pcip选中Install Package并回车,输入 ...

  9. get请求在ie浏览器中缓存问题

    // 请求时拦截器 axios.interceptors.request.use((config) => {const token = store.state.token;// ie11 缓存处 ...

最新文章

  1. linux上使用git把代码push到gitee上
  2. Python之路,day3-Python基础
  3. 几种常用的图像处理函数库
  4. 关于BFD(双向转发检测)开发的总结
  5. XCode连接手机时提示A Valid provisioning profile for this executable was not found
  6. 当全家人一起看电影,播到羞羞镜头时......
  7. 01.MyBatis入门
  8. 【Python】Matplotlib利用指数函数的向量及其逆向向量绘图
  9. Android 系统(241)---IPv4 or IPv6 优先
  10. 友商侧目!realme首款升降全面屏手机realme X发布
  11. python获取sap数据_python 连接 SAP HANA 数据库
  12. tp5 前台 点击显示一个弹窗
  13. 程序布置到服务器上速度慢_百战程序员python面试题总结---高级语法(4)
  14. 如何使用API爬取数据,它和网页爬虫有什么区别?
  15. python通讯录课程设计
  16. c语言万年历查询程序代码,C语言实现万年历程序
  17. 用ADB操纵手机实现连点器(折衷案)
  18. mysql打字竖线_如何打出竖线,教你怎样键盘打出竖线?
  19. centos7安装dcos
  20. Appium 真机测试

热门文章

  1. unserialize用法
  2. putty远程登录ssh主机
  3. x86构架之-Intel8042键盘控制器简介
  4. 【5】dockerfile制作镜像
  5. 解决方案:Lua环境搭建
  6. java模拟双向链表实现
  7. Python --之练习题
  8. DevOps落地三部曲:如何归责?用啥工具?往哪里去?
  9. ASP.NET MVC实践系列1-UrlRouting
  10. RESTful JSON Web服务最佳实践