通常我们用html或asp.net页面承载Silverlight包,由于浏览器缓存机制的存在,使得你的应用更新时,客户见到往往是旧版的程序,而完全禁止缓存,每次打开页面都要重新下载xap,对于体积较大的程序,这将使用户体验大打折扣!
下面介绍一种可手动控制客户端是否刷新xap包的方法,既保证升级的时候客户端能同步更新,又可使用缓存机制,加速程序加载速度:
1.站点的默认页采用aspx或jsp,然后转向另一个真正承载xap的页面(可以是aspx,jsp或html), 下面以aspx为例,首页index.aspx代码如下
<%@ Page Language="C#" AutoEventWireup="true" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
</head>
<body>
<%Server.Transfer("root.html?"+DateTime.Now.ToString(),true);%>
</body>
</html>
2.root.html代码片段
<form id="form1" runat="server" style="height:100%">
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/Sample.xap?4"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="5.0.61118.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
</form>
方法的核心是采用动态首页转向不被缓存的承载页面,只有保证承载页面不被缓存,那么你手动更改Sample.xap?XXX参数的时候才会生效;其次是每次升级的时候,对应手动修改Sample.xap?XXX的参数即可保证客户端浏览器会重新下载xap,又由于此参数是常量,可以使得缓存机制生效!
这里着重再强调下, 有人也许会问为什么不直接将root.html设为首页?因为html页面本身也是会被缓存的,即使你把xap的参数改了,客户端缓存的也是旧版的html。当然首页也可以不用aspx,直接用html配合js随机函数也可实现跳转-----只是地址栏url会跟着变化,看上去很没有技术含量啊,呵呵。
参考:http://www.cnblogs.com/vimsk/archive/2011/04/09/2010812.html