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

时间:2010-07-22 05:08:55

标签: .net asp.net silverlight

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

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

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

问题是浏览器在部署到服务器后没有加载新的Silverlight应用程序。

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

<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应用程序在我的localhost上工作(上传和启动)没有任何参数跳舞。只有当我将其上传到网站时 - 它才会被浏览器重新加载。并在xap文件路径中添加其他参数 - 对localhost无效。

4 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分:4)

我还在测试,但到目前为止,似乎修改 AssmeblyFileVersion 会强制浏览器下载最新的xap文件。使用Silverlight 4,我尝试了许多其他提供的解决方案,无法让它们工作或者它们是不受欢迎的(就像根本没有缓存一样)。现在我正在递增文件版本,它似乎每次都抓住最新的xap。

[assembly: AssemblyFileVersion("1.0.0.1234")]

答案 2 :(得分:2)

这应该按预期工作,也许它与你如何附加参数有关。请尝试删除Ver=部分:

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

我以前使用过这种方法,这是绕过任何客户端缓存的最佳方式。

如果您希望它始终刷新并且永不缓存,您只需将当前DateTime添加到结尾,这也将始终是唯一的。不知道什么时候你想在现实世界的场景中这样做,但它非常适合测试,以确保你永远不会运行缓存版本。例如:

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

如果这不起作用,只需将它们全部移除,不添加到末尾,看看它是否加载。我有一种感觉,错误是其他的,因为它并不真正适用于xap文件的位置。

答案 3 :(得分:1)

管理浏览器缓存的正确方法是通过服务器发送的适当的http响应标头告诉它您对它的期望。

在IIS管理器中,指定ClientBin文件夹的内容立即过期。

请注意,这并不意味着每次请求都会下载Xap,只是浏览器应该检查其缓存副本是否是最新的。