Silverlight:xap包(或本地缓存)下载版本更新的解决思路
2014-02-20 20:25
127 查看
在SL开发中,通常会将项目按模块分成多个xap实现按需下载,但是由于浏览器的缓存,就算某个模块代码修改过并重新发布到服务器,如果这个xap已经在浏览器缓存中,实际加载时,仍然有可能调用的是本地缓存,而非最新的版本。
通常解决这个问题的办法是在xap包的下载地址后附加一个随机数,类似http://xxx.com/abc.xap?t=1235817232 之类。但是这样相当于强制浏览器每次去重新下载xap文件,缓存机制被完全给干掉了,特别是对于一些大型项目,xap通常比较大,每次重新下载,需要较长时间,用户的体验非常差。
相对比较科学的方法是用"版本号"来替换"随机数",比如http://xxx.com/abc.xap?v=20101001
每次发布时,更新版本号即可。但是修改版本号这种体力活儿,最好由机器自动完成,而不是靠人来完成。
为此,我们先做创建一个自动生成版本号的工具:GenVersion.exe,它是一个Console Application,代码极其简单
+ View Code?
注:这里我们用日期字符串做为版本号.
接下来,我们利用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的按需加载,同步也适用于独立存储中的缓存数据,有时候我们会把一些不经常更新的数据以文件形式保存在客户端本地作为数据缓存,同样也会遇到版本更新的问题。
解决的方法很简单:
类似以上的做法,在缓存文件的第一行记录版本号,然后在调用本地缓存之前,取服务端版本号对比,如果发现服务端的版本更新,则更新本地缓存,否则直接使用本地缓存。
示例源码下载:http://files.cnblogs.com/yjmyzz/VersionSample.7z
通常解决这个问题的办法是在xap包的下载地址后附加一个随机数,类似http://xxx.com/abc.xap?t=1235817232 之类。但是这样相当于强制浏览器每次去重新下载xap文件,缓存机制被完全给干掉了,特别是对于一些大型项目,xap通常比较大,每次重新下载,需要较长时间,用户的体验非常差。
相对比较科学的方法是用"版本号"来替换"随机数",比如http://xxx.com/abc.xap?v=20101001
每次发布时,更新版本号即可。但是修改版本号这种体力活儿,最好由机器自动完成,而不是靠人来完成。
为此,我们先做创建一个自动生成版本号的工具:GenVersion.exe,它是一个Console Application,代码极其简单
+ View Code?
注:这里我们用日期字符串做为版本号.
接下来,我们利用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的按需加载,同步也适用于独立存储中的缓存数据,有时候我们会把一些不经常更新的数据以文件形式保存在客户端本地作为数据缓存,同样也会遇到版本更新的问题。
解决的方法很简单:
类似以上的做法,在缓存文件的第一行记录版本号,然后在调用本地缓存之前,取服务端版本号对比,如果发现服务端的版本更新,则更新本地缓存,否则直接使用本地缓存。
示例源码下载:http://files.cnblogs.com/yjmyzz/VersionSample.7z
相关文章推荐
- Silverlight:xap包(或本地缓存)下载版本更新的解决思路
- Silverlight:xap包(或本地缓存)下载版本更新的解决思路
- Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
- webgame:版本更新与本地缓存
- 关于ClickOnce无法更新/Upgrade/下载 应用系统最新版本的问题和解决方法
- 如何解决更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外 提示:一个版本库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更 提示:(如 'git pull ...')。
- Android App更新版本以及提示用户下载最新apk(有图,有代码,有最终效果图)详细解释及思路
- 一种关于缓存数据何时更新的解决思路
- Andriod 版本更新以及安装包下载等遇到问题以及解决
- silverlight缓存无法更新的简易解决办法
- 解决更新本地svn版本库,提示:工作副本已锁定 问题
- 如何解决更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外 提示:一个版本库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更 提示:(如 'git pull ...')。
- Android提示版本更新(如何计算下载进度核心思路)
- maven项目中依赖的jar包更新后, 本地项目无法下载对应版本的原因之一
- 使用SharedObject缓存游戏框架到本地和版本更新的demo
- 解决 win 7 64 位 vs2010 调试silverlight项目无法加载,提示更新developer ,跟新报 消息 ID: 1517 已安装了 Silverlight 的 64 位版本
- sdk 更新 api版本 无可下载选项 解决
- Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
- Android 版本更新下载自动安装APK,并解决Android6.0,7.0安装失败的问题