Silverlight:xap包(或本地缓存)下载版本更新的解决思路

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

在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的按需加载,同步也适用于独立存储中的缓存数据,有时候我们会把一些不经常更新的数据以文件形式保存在客户端本地作为数据缓存,同样也会遇到版本更新的问题。

解决的方法很简单:

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

示例源码下载:http://files.cnblogs.com/yjmyzz/VersionSample.7z
 

目录
相关文章
|
5月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
缓存 Android开发
Android - 手机下载的缓存视频在文件管理怎么找不到?
Android - 手机下载的缓存视频在文件管理怎么找不到?
1540 0
Android - 手机下载的缓存视频在文件管理怎么找不到?
|
30天前
|
缓存 开发框架 移动开发
uni-app:下载使用uni&创建项目&和小程序链接&数据缓存&小程序打包 (一)
uni-app 是一个跨平台的开发框架,它允许开发者使用 Vue.js 来构建应用程序,并能够同时发布到多个平台,如微信小程序、支付宝小程序、H5、App(通过DCloud的打包服务)等。uni-app 的目标是通过统一的代码库,简化多平台开发过程,提高开发效率。 在这一部分中,我们将逐步介绍如何下载和使用uni-app、创建一个新的项目、如何将项目链接到小程序,以及实现数据缓存的基本方法。
|
5月前
|
缓存 Java Spring
SpringBoot配置第三方专业缓存技术Memcached 下载 安装 整合测试 2024年5000字详解
SpringBoot配置第三方专业缓存技术Memcached 下载 安装 整合测试 2024年5000字详解
45 0
|
6月前
|
缓存 Linux 应用服务中间件
linux yum下载离线包缓存 安装到服务器 实测!!!
linux yum下载离线包缓存 安装到服务器 实测!!!
107 0
|
存储 缓存 iOS开发
iOS 轻量化动态图像下载缓存框架实现
日常开发过程中,图片的下载会占用大量的带宽,图片的加载会消耗大量的性能和内存,正确的使用图片显得尤为重要。 同样也经常需要在各类型控件上读取网络图片和处理本地图片,例如:UIImageView、UIBtton、NSImageView、NSButton等等。
iOS 轻量化动态图像下载缓存框架实现
解决Office 365套件一直提示“缓存凭据已到期,无法上载或下载你的更改”问题
解决Office 365套件一直提示“缓存凭据已到期,无法上载或下载你的更改”问题
解决Office 365套件一直提示“缓存凭据已到期,无法上载或下载你的更改”问题
|
缓存 Java
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
同程内网流传的分布式凤凰缓存系统手册,竟遭GitHub强行开源下载
什么是分布式缓存? 分布式缓存能够处理大量的动态数据,因此比较适合应用在Web 2.0时代中的社交网站等需要由用户生成内容的场景。从本地缓存扩展到分布式缓存后,关注重点从CPU、内存、缓存之间的数据传输速度差异也扩展到了业务系统、数据库、分布式缓存之间的数据传输速度差异。 今天给大家分享的是一本从大型互联网大厂系统角度探讨分布式系统的手册,从原理、框架、架构、案例等多个视角对分布式缓存进行了探讨
同程内网流传的分布式凤凰缓存系统手册,竟遭GitHub强行开源下载
|
缓存 前端开发 JavaScript
记录:centos7.6之Tomcat8.5发布dist包vue页面缓存问题...【解决方案】
记录:centos7.6之Tomcat8.5发布dist包vue页面缓存问题...【解决方案】
241 1
下一篇
无影云桌面