Silverlight: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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张首富-小白的成长历程

Nginx

直接去官网(www.nginx.org)查找源码包,直接复制链接地址下载,我们一般选择stable(稳定版),不选择最新版本

685220
来自专栏用户2442861的专栏

vi/vim编辑器必知必会

Linux的命令行界面下面有非常多的文本编辑器。比如经常听说的就有Emacs、pico、nano、joe与vim等。vim可以看做是vi的高级版。我们为什么一...

17000
来自专栏云计算与大数据

研发:Idea工具因为版本工具设置问题,导致全是红色

I have the current status of my files in the folders coloured red/brown. I tried...

15530
来自专栏用户2442861的专栏

push到github时,每次都要输入用户名和密码的问题

http://blog.csdn.net/yuquan0821/article/details/8210944

10410
来自专栏余生开发

electron-vue———桌面应用开发

Electron 基于 Chromium 和 Node.js, electron-vue 基于election融合vue脚手架,来开发桌面应用,可以理解为在软...

50230
来自专栏芋道源码1024

深入分析 Session 和 Cookie

在Web发展史中,我们知道浏览器与服务器间采用的是http协议,而这种协议是无状态的,所以这就导致了服务器无法知道是谁在浏览网页,但很明显,一些网页需要知道用户...

15720
来自专栏小白安全

小白博客 linux常用操作命令

常用指令 ls   显示文件或目录      -l 列出文件详细信息l(list)      -a 列出当前目录下所有文件及目录,包括隐藏的a...

29870
来自专栏Java架构沉思录

一文读懂分布式Session常见解决方案

沉思君在之前的文章《谈谈HTTP状态保持》里介绍了有关HTTP状态保持的知识点,我们知道HTTP协议本身是无状态的,因此在使用HTTP协议进行通信的过程中,需要...

745150
来自专栏Java帮帮-微信公众号-技术文章全总结

Linux常用命令

Linux常用命令 常用指令 ls   显示文件或目录 -l 列出文件详细信息l(list) -a ...

56260
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(二十三) ——Redis服务器初始化

《Redis设计与实现》读书笔记(二十三) ——Redis服务器初始化 (原创内容,转载请注明来源,谢谢) redis服务器开启时,会先进行初始化,主要有五个步...

36170

扫码关注云+社区

领取腾讯云代金券