博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
强制客户端更新Silverlight XAP文件方法汇总(转)
阅读量:5046 次
发布时间:2019-06-12

本文共 3025 字,大约阅读时间需要 10 分钟。

原文地址:

 

当新版本的Silverlight应用发布时,浏览器缓存会查询本地是否已经存在同名XAP文件,并进行简单校验,如果存在并且验证相同,将忽略下载更新最新版本XAP文件。我们可以通过以下几种方式,强制浏览器更新下载XAP文件,

 

方法1. IIS设置方式

通过在设置IIS属性,强制XAP文件过期,使浏览器将重新下载XAP文件,步骤如下:

- 打开IIS管理器;

- 打开“默认网站”, 然后找到部署的Silverlight项目;

- 在“ClientBin”目录下找到XAP文件;

- 进入XAP属性页面,然后选择“HTTP Response Headers”;

 

- 在Actions栏,选择“Set Common Headers...";

 

- 选择”Expire Web Content - Immediately“, 然后保存设置。

 

这样设置后,每当页面刷新时将强制Web页面内容过期,立即重新下载最新的XAP文件到本地。

 

方法2,动态方式强制更新 

所谓动态方式强制更新,其实每次部署时使用不同的XAP文件名,浏览器每次检测到不同的文件名,则将重新下载XAP文件。

这种方式有很多种实现方法,例如,可以手动添加一个XAP文件参数,也可以动态生成一个随机参数,或者根据不同版本号绑定到XAP文件名后等。

在下面实例代码中,根据部署的日期不同,将日期字符串作为XAP文件的参数,以此强制更新XAP文件,

代码修改静态代码”<param name="source" value="ClientBin/SilverlightApp.xap"/>“为动态代码,当项目不是在Debug模式下,则生成新的XAP文件路径。

<
object 
id
="Xaml1"
 data
="data:application/x-silverlight-2,"
 type
="application/x-silverlight-2"
width
="100%"
 height
="100%"
>
<%
string
 orgSourceValue 
=
 @
"
ClientBin/SilverlightApp.xap
"
;
string
 param;
if
 (System.Diagnostics.Debugger.IsAttached)
param 
= 
"
<param name=\
"
source
\
"
 value=\"" + orgSourceValue + 
"
\
"
 />
"
;
else
{
string
 xappath 
=
 HttpContext.Current.Server.MapPath(@
""
+
 @
"
\
" 
+
 orgSourceValue;
DateTime xapCreationDate 
=
 System.IO.File.GetLastWriteTime(xappath);
param 
= 
"
<param name=\
"
source
\
"
 value=\"" + orgSourceValue + 
"
?ignore
=
"
+
 xapCreationDate.ToString() 
+ 
"
\
" 
/>
"
;
}
Response.Write(param);
%>
<
param 
name
="onError"
 value
="onSilverlightError" 
/>

方法3, 本地自动生成版本号强制更新XAP文件

该方法由网友”菩提树下的杨过“提出,作者创建简单本地应用,使用本地应用生成不同的XAP文件名参数,其原理与方法2相同,实现方法不同。

在SL开发中,通常会将项目按模块分成多个xap实现按需下载,但是由于浏览器的缓存,就算某个模块代码修改过并重新发布到服务器,如果这个xap已经在浏览器缓存中,实际加载时,仍然有可能调用的是本地缓存,而非最新的版本。

  通常解决这个问题的办法是在xap包的下载地址后附加一个随机数,类似http://xxx.com/abc.xap?t=1235817232 之类。但是这样相当于强制浏览器每次去重新下载xap文件,缓存机制被完全给干掉了,特别是对于一些大型项目,xap通常比较大,每次重新下载,需要较长时间,用户的体验非常差。

  相对比较科学的方法是用"版本号"来替换"随机数",比如http://xxx.com/abc.xap?v=20101001

  每次发布时,更新版本号即可。但是修改版本号这种体力活儿,最好由机器自动完成,而不是靠人来完成。

  为此,我们先做创建一个自动生成版本号的工具:GenVersion.exe,它是一个Console Application,代码极其简单using System;

using System.IO;
namespace GenVersion
{
    class Program
    {
        static void Main(string[] args)
        {
            string _fileName = "Version.txt";
            if (args.Length > 0)
            {
                _fileName = args[0];           
            }
            File.WriteAllText(_fileName, DateTime.Now.ToString("yyyyMMddHHmmss"));
           
        }
    }
}

  注:这里我们用日期字符串做为版本号.

  接下来,我们利用vs.net的生成事件,在每次编译成功时,自动调用这个exe,在website的Version目录下生成Version.txt

  关键是:call $(ProjectDir)Version\GenVersion.exe $(ProjectDir)Version\Version.txt 这一条指令.

  注:Version目录下如何编译时不能自动更新Version.txt文件,请检测该文件夹是否有写权限。

  自动生成版本号的问题解决了,SL如何使用服务端的这个版本号呢?

  SL端Loading项目的处理逻辑如下:

  1、先检测本地独立存储(也可以用Cookie来存储)中的客户端版本信息,得到客户端版本号ClientVersion

  2、再去加载服务端的Version.txt,得到服务端的版本号ServerVersion

  3、对比二个版本号,声明一个变量,取二个版本号的最大值,保存在MaxVersion中。

  4、加载主模块xap包时,用类似http://www.xxx.com/SL_App.xap?v=MaxVersion 的Uri加载

  5、下载完成后,将MaxVersion保存到本地独立存储(或Cookie中),以方便下次对比。

  以上思路,不仅仅适用于处理XAP的按需加载,同步也适用于独立存储中的缓存数据,有时候我们会把一些不经常更新的数据以文件形式保存在客户端本地作为数据缓存,同样也会遇到版本更新的问题。

  解决的方法很简单:

  类似以上的做法,在缓存文件的第一行记录版本号,然后在调用本地缓存之前,取服务端版本号对比,如果发现服务端的版本更新,则更新本地缓存,否则直接使用本地缓存。

转载于:https://www.cnblogs.com/xh831213/archive/2012/07/20/2601388.html

你可能感兴趣的文章
web自己主动保存表单
查看>>
一个小的日常实践——高速Fibonacci数算法
查看>>
创建与删除索引
查看>>
java的基本数据类型
查看>>
机器学些技法(9)--Decision Tree
查看>>
静态页面复习--用semantic UI写一个10min首页
查看>>
在Windows下安装64位压缩包版mysql 5.7.11版本的方法
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
利用mysqldump备份mysql
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
吴裕雄 python 机器学习——数据预处理嵌入式特征选择
查看>>
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>
【linux】重置fedora root密码
查看>>
用swing做一个简单的正则验证工具
查看>>
百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)和WGS-84坐标互转
查看>>