Silverlight:如何强制浏览器下载更新的客户端版本?

7

我的Silverlight(4.0)应用程序(由ASP.NET网站托管)使用4个项目,它们都使用一个具有程序集版本的文件:

[assembly: AssemblyVersion("1.0.*")]

当前显示的应用程序版本为1.0.3842.38865,但最新版本(1.0.3854.42448)最近已上传到服务器。

问题在于浏览器在部署到服务器后无法加载新的Silverlight应用程序。

这是用于“渲染”Silverlight-html-loader的HTML代码(不确定是否是正确的名称):

<div id="silverlightControlHost" style="height:950px"> 
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
  <param name="source" value="/ClientBin/VfmElitaSilverlightClientApplication.xap"/> 
  <param name="onError" value="onSilverlightError" /> 
  <param name="background" value="white" /> 
  <param name="initParams" value="adr=squad,team=811,match=3217203" /> 
  <param name="minRuntimeVersion" value="3.0.40624.0" /> 
  <param name="autoUpgrade" value="true" /> 
  <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none"> 
      <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/> 
  </a> 
</object> 
<iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe> 

我试图向包含最后一个XAP文件修改时间的对象的“source”参数添加一个参数:

  <param name="source" value="/ClientBin/VfmElitaSilverlightClientApplication.xap?Ver=2010072243523AM"/>

导致Silverlight应用程序加载错误的原因是:

未处理的Silverlight应用程序错误 代码:2103 类别: InitializeError 消息: 应用程序无效或格式不正确: 请检查清单

请问,您能否建议如何强制浏览器从服务器获取新应用程序(不涉及浏览器缓存操作,我想保留浏览器缓存选项)?
非常感谢!
P.S. 需要补充说明的是,我的本地主机上Silverlight应用程序可以正常工作(上传和启动),而不需要任何参数调整。只有当我将其上传到网站时,浏览器才无法重新加载它。添加附加参数到xap文件路径也无法在本地主机上起作用。

当网站重新加载时,应用程序会重新加载。您想强制执行此操作吗?或者甚至网站的重新加载也无法正常工作吗? - DHN
是的,网站重新加载不会导致Silverlight应用程序重新加载。 - Budda
4个回答

4
我们目前使用的方法是,获取.xap文件的最后写入时间,并将其添加到source-param参数中:
<object ... >
        <%
            var source = "ClientBin/App.xap";
            string param;
            if (System.Diagnostics.Debugger.IsAttached)
                param = string.Format("<param name=\"source\" value=\"{0}\" />", source);
            else
            {
                var path = HttpContext.Current.Server.MapPath(string.Empty) + "\\" + source;
                var xapCreatedAt = System.IO.File.GetLastWriteTime(path);
                param = string.Format("<param name=\"source\" value=\"{0}?version={1}\" />",
                    source,
                    xapCreatedAt.ToString("yyyyMMddTHHmmssfff"));
            }
            Response.Write(param);
        %>
        <param ...

4

我还在进行测试,但目前看来,修改AssemblyFileVersion似乎会强制浏览器下载最新的xap文件。使用Silverlight 4时,我尝试了许多其他解决方案,但无法使它们正常工作,或者它们不太理想(例如完全没有缓存)。现在我正在递增文件版本,每次它似乎都会获取最新的xap文件。

[assembly: AssemblyFileVersion("1.0.0.1234")]

2

这应该按预期工作,可能与您附加参数的方式有关。尝试删除Ver=部分:

<param name="source"
    value="/ClientBin/VfmElitaSilverlightClientApplication.xap?2010072243523AM"/> 

我过去曾经使用过这种方法,它是绕过任何客户端缓存的最佳方式。

如果你希望它总是刷新而不缓存,你可以在结尾添加当前的DateTime,这样也将始终是唯一的。不确定在现实场景中何时需要这样做,但它非常适合测试,以确保你从未运行过缓存版本。例如:

<param name="source"
    value="/ClientBin/VfmElitaSilverlightClientApplication.xap?<%= DateTime.Now.Ticks.ToString() "/>

如果这样不起作用,可以完全删除它,不要在结尾添加任何内容,然后查看是否加载。我有一种感觉,错误是其他原因导致的,因为它并不真正适用于xap文件的位置。

在本地主机上,如果在“.xap”之后添加任何内容,都会阻止应用程序的下载和启动,因此我没有尝试在真实网站上检查这个问题。 - Budda

1
管理浏览器缓存的正确方法是通过服务器发送适当的HTTP响应头告诉它您的期望。
在IIS管理器中,指定ClientBin文件夹的内容立即过期。
请注意,这并不意味着Xap将在每个请求上下载,只是浏览器应该检查其缓存的副本是否是最新的。

2
有没有办法在客户端运行时强制刷新?我的用户会让客户端保持打开状态数天。 - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接