如何强制重新下载Silverlight XAP文件

时间:2011-05-13 11:49:45

标签: silverlight versioning browser-cache xap

我正在试图弄清楚如果新版本可用且强制浏览器重新下载.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部分。这是什么样的对象?我很抱歉重新开放,但我希望人们能够发布完整的解决方案。

由于

3 个答案:

答案 0 :(得分:8)

您所看到的是基于asp:Silverlight网络服务器控件的代码,但该控件已从Silverlight 3开始停止。

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

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

<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");

}

这将确保在xap发生更改时,用于源的URL始终会更改。您遇到的原始代码存在缺陷,因为在没有完全未连接的程序集版本号更改的情况下,xap仍然可以更改。

答案 1 :(得分:1)

您可以将当前日期时间附加到xap,每次都会被视为新的,因此客户端不会进行缓存。

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

希望这有帮助。

答案 2 :(得分:0)

myApp可能是一个Web控件,它在页面中呈现Silverlight对象。

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