Silverlight奇技银巧7 - 巧用文件生成时间强制客户端载入最新xap文件

    像大多数的项目一样,即使在将Silverlight应用程序交付后,我们仍会根据客户的需求进行相应修改并将xap文件发送给客户,客户经过测试后再部署到生产环境。

    这样经常会面临一个问题,客户更新xap后并未看到任何变化甚至由于我们wcf服务等相关文件的改动会让程序执行发生异常。这个原因倒是很明显--我们的xap文件被缓存了,当服务器上替换了新的xap文件时,本地并未重新从服务器上下载。这时候我们当然就要告知客户如何清理缓存等等,再碰到个电脑盲(大多情况下)更是苦不堪言。客户抱怨,项目经理哑巴吃黄连…

    那么有没有一种方法可以解决上面提到的问题呢?当然,且听分解。

    我们先看一段在html中签入Silverlight应用的标准代码示例

        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
          <param name="source" value="ClientBin/MefSample.xap"/>
          <param name="onError" value="onSilverlightError" />
          <param name="background" value="white" />
          <param name="minRuntimeVersion" value="4.0.50826.0" />
          <param name="autoUpgrade" value="true" />
          <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none">
               <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
          </a>
        </object>

    注意下面这行,我们就要从这里下手。

<param name="source" value="ClientBin/MefSample.xap"/>

    我们知道,要防止浏览器自动缓存文件,经常用的一个做法就是在要加载的文件名后面加入一个随机字符串(比如验证码的刷新),如Guid、DateTime.Now.Ticks一类。

    因此我们这里的思路就是通过判断xap文件的生成时间而决定是否重新载入xap包。

    最终View的全部代码如下:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
    width="100%" height="100%">
    @{
        string xapFile = "ClientBin/MefSample.xap";
        string xapPath = HttpContext.Current.Server.MapPath("\\") + xapFile;
        DateTime xapCreatedDate = System.IO.File.GetLastWriteTime(xapPath);
        xapFile += "?v=" + xapCreatedDate;
    }
    <param name="source" value="@xapFile" />
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="4.0.50826.0" />
    <param name="autoUpgrade" value="true" />
    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration: none">
        <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
            style="border-style: none" />
    </a>
</object>

注意,这里我是用ASP.NET MVC(Razor语法)承载xap,对WebForm或WebForm View同样适用,请自行更改。

作者:紫色永恒

出处:http://024hi.cnblogs.com/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

posted @ 2011-01-07 10:12 紫色永恒 阅读(765) 评论(7) 编辑 收藏

 回复 引用 查看   
#1楼 2011-01-07 10:40 Nereus      
Mark
 回复 引用 查看   
#2楼[楼主] 2011-01-07 10:42 紫色永恒      
@Nereus
多谢Mark囧

 回复 引用 查看   
#3楼 2011-01-07 16:42 焦涛      
学习了!标记下!!
 回复 引用 查看   
#4楼 2011-01-09 10:09 ggt0906s      
收藏了
 回复 引用   
#5楼 2011-07-20 13:40 tomwuvip[未注册用户]
你好,我按照你的方法做,发现连String都没有高亮显示并且程序发生对象不存在的错误,能否提示下什么原因?
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
width="100%" height="100%">
@ {string xapFile = "ClientBin/InitParams.xap";
string xapPath = HttpContext.Current.Server.MapPath("\\")+ xapFile;
DateTime xapCreatedDate = System.IO.File.GetLastWriteTime(xapPath);
xapFile+= "?v=" + xapCreatedDate;}
<param name="source" value="@xapFile" />

 回复 引用 查看   
#6楼[楼主] 2011-07-20 13:42 紫色永恒      
@tomwuvip
如果你没有用Razor引擎请不要这样做,Webform View依然要使用成对出现的<%%>

 回复 引用 查看   
#7楼 2011-07-30 21:29 _冻结_      
好办法,
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1929441 ZYToM22eeJQ=