【问题标题】:How to force re-download of Silverlight XAP file如何强制重新下载 Silverlight XAP 文件
【发布时间】:2011-08-24 21:17:30
【问题描述】:

如果新版本可用但旧版本仍缓存在浏览器中,我正试图弄清楚如何强制浏览器重新下载 .xap 文件。

我看过另一个帖子: How do you force Firefox to not cache or re-download a Silverlight XAP file?

最好的解决办法似乎是:

protected void Page_Load(object sender, EventArgs e)
{
    var versionNumber = Assembly.GetExecutingAssembly().GetName().Version.ToString();
    this.myApp.Source += "?" + versionNumber;
}

但是,我没有得到 this.myApp 部分。那是一个什么样的物体?很抱歉重新打开它,但我希望人们能发布完整的解决方案。

谢谢

【问题讨论】:

    标签: silverlight versioning browser-cache xap


    【解决方案1】:

    您看到的是基于 asp:Silverlight Web 服务器控件的代码,但该控件从 Silverlight 3 开始就停止了。

    现在我们要么直接使用对象标签,要么敲出我们自己的服务器控件来呈现我们对对象标签的偏好。

    作为一个对象标签,它看起来像这样:-

    <form id="form1" runat="server" style="height:100%">
    <div id="silverlightControlHost">
        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
          <param id="xapSource" runat="server" name="source" value="ClientBin/SilverlightApplication1.xap"/>
          <param name="onError" value="onSilverlightError" />
          <param name="background" value="white" />
          <param name="minRuntimeVersion" value="4.0.50303.0" />
          <param name="autoUpgrade" value="true" />
          <param name="initParams" id="initParams" runat="server" />
          <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50303.0" style="text-decoration:none">
              <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
          </a>
        </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
    </form>
    

    注意源参数上的 id 和 runat="server"。有了这个,页面加载可能看起来像这样:-

    protected void Page_Load(object sender, EventArgs e)
    {
        string xapPhysicalPath = Server.MapPath(xapSource.Attributes["value"]);
        DateTime lastWrite = System.IO.File.GetLastWriteTime(xapPhysicalPath);
        xapSource.Attributes["value"] = xapSource.Attributes["value"] + "?" + lastWrite.ToString("yyyyMMddThh:mm:ss");
    
    }
    

    这将确保用于源的 url 在 xap 更改时始终会更改。您遇到的原始代码存在缺陷,xap 仍然有可能在不更改完全未连接的程序集版本号的情况下进行更改。

    【讨论】:

    • 我无法在代码隐藏中访问“param”(在您的示例中为“xapSource”)对象,智能感知根本看不到它。难道我做错了什么?在 Designer.cs 文件中应该是什么样子?它的确切类型是什么?
    • 好的,我让它工作了。无法以编程方式访问参数,必须使用此解决方案:geekswithblogs.net/mbcrump/archive/2011/01/06/…
    • 是的,你做错了什么。它应该看起来像protected global::System.Web.UI.HtmlControls.HtmlGenericControl xapSource;。确切的类型是System.Web.UI.HtmlControls.HtmlGenericControl
    • @VexXTtreme:“无法以编程方式访问参数”。不是真的,我这样做是为了调整 initParams 的内容。熟练的silverlighters 通常在较早的ASP.NET 技能上稍有弱点。你在参数上有 runat="server" 对吗?它的 ID 为“xapSource”。然后你有一个HtmlGenericControl,你可以通过Attributes集合来操作它的属性。
    • 是的,你是对的。我无法访问它的原因是因为它不在designer.cs文件中,并且我不知道确切的类型并且无法手动添加它,所以我认为它根本无法访问。
    【解决方案2】:

    您可以将当前日期时间附加到 xap 中,每次都会将其视为新的,因此客户端上没有缓存。

    value="ClientBin/SilverlightApplication1.xap?<%=DateTime.Now%>"
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      myApp 可能是在页面中呈现 Silverlight 对象的 Web 控件。

      通过设置其 Source 属性,指向 XAP 的 url 获得了一个与以前版本不同的参数,导致浏览器使缓存的 xap 无效(为此参数设置了另一个值)。

      【讨论】:

      • 技术上不会发生缓存失效,浏览器以前从未见过该 url,因此无论如何都不会在缓存中找到它。
      猜你喜欢
      • 2010-12-15
      • 2011-09-18
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 2011-08-09
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多