代码之家  ›  专栏  ›  技术社区  ›  Budda

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

  •  7
  • Budda  · 技术社区  · 14 年前

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

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

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

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

    以下是用于“呈现”Silverlight HTML加载程序的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类别: 初始化错误消息: 无效或格式错误的应用程序: 检查清单

    您能否建议如何强制浏览器从服务器获取新的应用程序(在不使用浏览器缓存操作的情况下,我希望保留浏览器缓存选项)?

    非常感谢你!

    另外,有必要添加Silverlight应用程序在我的本地主机上运行(上传和启动)很好,不需要任何参数。只有当我上传到网站时,浏览器才不会重新加载。向xap文件路径添加其他参数-在本地主机上不起作用。

    4 回复  |  直到 14 年前
        1
  •  4
  •   JHiller    13 年前

    我们当前使用的是以下内容,它获取.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
  •  4
  •   S_Niles    13 年前

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

    [assembly: AssemblyFileVersion("1.0.0.1234")]
    
        3
  •  2
  •   Kelsey    14 年前

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

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

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

    如果您希望它总是刷新而从不缓存,您可以添加当前 DateTime 到最后,这也是独一无二的。不确定在现实场景中什么时候需要这样做,但对于测试来说,这是很好的,可以确保您从来没有运行过缓存版本。如:

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

    如果这不起作用,只需将其全部移除,而不添加到末尾,然后查看是否加载。我觉得这个错误是另外一个问题,因为它实际上并不适用于xap文件的位置。

        4
  •  1
  •   AnthonyWJones    14 年前

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

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

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