强制客户端更新Silverlight XAP文件方法汇总
原文地址: http://www.cnblogs.com/jv9/archive/2012/07/17/2595015.html
http://www.cnblogs.com/yjmyzz/archive/2011/08/07/2130308.html
当新版本的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文件路径。
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的按需加载,同步也适用于独立存储中的缓存数据,有时候我们会把一些不经常更新的数据以文件形式保存在客户端本地作为数据缓存,同样也会遇到版本更新的问题。
解决的方法很简单:
类似以上的做法,在缓存文件的第一行记录版本号,然后在调用本地缓存之前,取服务端版本号对比,如果发现服务端的版本更新,则更新本地缓存,否则直接使用本地缓存。
强制客户端更新Silverlight XAP文件方法汇总相关推荐
- python封装方法有几种_Python打包exe文件方法汇总【4种】
Python 打包 exe 文件方法汇总 Python 作为解释型语言,发布即公开源码, 虽然是提倡开源但是有些时候就是忍不住想打包成 exe ,不仅仅是为了对代码进 行加密,而是为了跨平台.防止有些 ...
- 好用的python打包软件_Python打包exe文件方法汇总【4种】
title: Python打包exe文件方法 copyright: true top: 0 date: 2018-08-11 21:08:21 tags: 打包 categories: Python进 ...
- 怎么找回电脑误删的文件方法汇总
我是一名互联网小编,理工科的我接触互联网编辑的行业往往很难适应,往往需要看很多文献才能写原创文章,有时候在写原创文章的时候,好不容易思路来了,突然电脑断电重新打开电脑,之前写的文档找不到了,简直要吐血 ...
- android 打开部分文件方法汇总整理
总结打开文件的的方法代码: /*** 打开文件* @param file*/ private void openFile(File file){ Intent intent = new Intent( ...
- python3下载文件-python3 下载文件方法汇总
学习python爬虫中,特地mark,以备忘 方法一: 使用 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. urlretrie ...
- java文件打包jar文件_Java打包成jar文件,以及将jar文件导出为exe文件方法汇总(图形说明)...
方法一:用j2ewiz,使用方法如下: 操作步骤: 1. 双击j2ewiz.exe,出现软件注册窗口,点击下一步. 2. 选择待转换的Jar文件及最低Jvm版本.我选择 ...
- pandas输出到excel_python读写excel等数据文件方法汇总
python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python ...
- Linux rm 删除指定文件外的其他文件 方法汇总
一.Linux下删除文件和文件夹常用命令如下: 删除文件: rm file 删除文件夹: rm -rf dir 需要注意的是, rmdir 只能够删除 空文件夹 . 二.删除制定文件(夹)之外的所有文 ...
- 导出excel、word、csv文件方法汇总
excel文件主要是输出html代码.以xls的文本格式保存文件. 生成excel格式的代码: [code lang="CSharp"] /// <summary> / ...
- MFC打开一个文件方法汇总
第1个回答 CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOOL bOpenFileDi ...
最新文章
- 科大讯飞刷新纪录,机器阅读理解如何超越人类平均水平? | 技术头条
- 跳至下一个断点_基金经理:DeFi将推动以太坊在下一个上涨周期中涨至9000美元...
- Oracle数据库备份报错12514,Oracle数据库备份导出时,报错:ORA-12514
- springmvcdate类型接收不到_无线电小课堂:如何在市区环境有效接收短波信号,选什么天线?...
- 用Heartbeat实现web服务器高可用
- parseInt(string, radix)
- 大兴新年大集 推10条文化旅游线
- 铁路系统的在线检测系统讲座
- 满满的干货!mysql技术介绍
- joomla添加html,如何将自定义html代码添加到Joomla 2.5菜单项?
- 基于Python从头开始使用 RMSProp 进行梯度下降
- LRN局部响应归一化
- Android替换开机动画
- C语言printf()输出格式大全
- android全面屏像素密度,手机屏幕分辨率、PPI像素密度科普知识大全
- ArcGIS中shp文件的裁剪
- 【转】CT (电子计算机断层扫描)
- thinkphp6获取字符串中的中文首字母
- 数字图像处理——灰度变换
- 【蓝桥杯省赛JavaB组真题详解】立方变自身(2015)
热门文章
- 关于工作后定居城市的思考以及房价预测(天涯原创)
- springboot基于web儿童教育网站111123
- 计算机一级标题底纹,2017年计算机一级考试MSOffice考点解析:幻灯片背景的设置...
- 解决 Chrome 浏览器跨域加载本地文件的问题
- 千锋前端-React全家桶_React项目实战全球新闻发布管理系统-db.json文件数据
- linux安装系统时安装多路径包,红帽子linux安装配置多路径
- 07 巧算指数温度--参考即可不用算
- 《沉思录卷一》闪耀在私人生活圈的品质
- ruby语言+Devkit 工具
- Docker容器查看ip地址