【问题标题】:Silverlight: how to force browser to download updated client version?Silverlight:如何强制浏览器下载更新的客户端版本?
【发布时间】:2010-07-22 05:08:55
【问题描述】:

我的 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 文件修改时间的对象的“源”参数:

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

导致 Silverlight 应用程序加载出错:

Silverlight 中未处理的错误 申请代码:2103 类别: 初始化错误消息: 无效或格式错误的应用程序: 检查清单

您能否建议如何强制浏览器从服务器获取新应用程序(没有浏览器缓存操作,我想保留浏览器缓存选项)?

非常感谢!

附:有必要补充一点,silverlight 应用程序可以在我的本地主机上正常工作(上传和启动),而无需任何参数。只有当我将它上传到网站时 - 它不会被浏览器重新加载。并向 xap 文件路径添加其他参数 - 在 localhost 上不起作用。

【问题讨论】:

  • 在重新加载网站时重新加载应用程序。你想强制执行吗?或者甚至网站的重新加载都不起作用?
  • 是的,网站重新加载不会导致 silverlight 应用程序重新加载

标签: .net asp.net silverlight


【解决方案1】:

我们目前使用的是以下内容,它获取 .xap 文件的最后写入时间并将其附加到源参数:

<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 ...

【讨论】:

    【解决方案2】:

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

    [assembly: AssemblyFileVersion("1.0.0.1234")]
    

    【讨论】:

      【解决方案3】:

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

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

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

      如果您希望它始终刷新并且从不缓存,您只需将当前的 DateTime 添加到末尾,这也将始终是唯一的。不确定您何时希望在现实世界的场景中执行此操作,但它非常适合测试以确保您永远不会运行缓存版本。例如:

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

      如果这不起作用,只需将其全部删除,不要在末尾添加任何内容,然后查看它是否加载。我感觉这个错误是别的东西,因为它并不真正适用于 xap 文件的位置。

      【讨论】:

      • 在“.xap”之后添加任何内容会阻止应用程序在本地主机上下载和启动,所以我没有尝试在真实网站上检查。
      【解决方案4】:

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

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

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

      【讨论】:

      • 有没有办法强制客户端在运行时刷新?我有一些用户让客户端打开几天。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2010-12-15
      • 2015-07-30
      • 1970-01-01
      • 2012-01-10
      • 2011-09-25
      相关资源
      最近更新 更多