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

7
我正在努力找出如何强制浏览器重新下载.xap文件,如果新版本可用且旧版本仍在浏览器缓存中。 我已经看到了其他线程:如何强制Firefox不缓存或重新下载Silverlight XAP文件? 最佳解决方案似乎是:
protected void Page_Load(object sender, EventArgs e)
{
    var versionNumber = Assembly.GetExecutingAssembly().GetName().Version.ToString();
    this.myApp.Source += "?" + versionNumber;
}

然而,我不理解this.myApp这部分。那是什么对象?很抱歉重新提出这个问题,但我希望人们能够发布完整的解决方案。
谢谢。
3个回答

8
你看到的是基于asp:Silverlight Web服务器控件的代码,但该控件从Silverlight 3开始已停用。
现在我们要么直接使用object标记,要么创建自己的服务器控件来呈现我们喜欢的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仍然可能更改,而完全不相关的程序集版本号却没有更改。

我无法在CodeBehind中访问"param"对象(在你的示例中是"xapSource"),智能感知根本无法看到它。我做错了什么吗?在designer.cs文件中应该是什么样子?它的确切类型是什么? - user302845
好的,我已经解决了。Param不能通过编程方式访问,必须使用此解决方案:http://geekswithblogs.net/mbcrump/archive/2011/01/06/prevent-your-silverlight-xap-file-from-caching-in-your-browser.aspx - user302845
是的,你做错了什么。它应该看起来像 protected global::System.Web.UI.HtmlControls.HtmlGenericControl xapSource;。确切的类型是 System.Web.UI.HtmlControls.HtmlGenericControl - AnthonyWJones
@VexXTtreme:“无法通过编程方式访问Param”。这不是真的,我这样做是为了调整initParams的内容。通常,熟练的Silverlight开发人员在旧版ASP.NET技能方面有些薄弱。您在param上有runat =“server”吗?它具有id“xapSource”。然后,您就拥有了一个HtmlGenericControl,可以通过Attributes集合来操作其属性。 - AnthonyWJones
是的,你说得对。我无法访问它的原因是因为它不在 designer.cs 文件中,而且我不知道确切的类型,也不能手动添加,所以我假定根本无法访问它。 - user302845
@VexXtreme:我刚意识到可能混淆的源头。要修改的属性是“值”,而不是“源”。我已经相应地调整了答案,我犯了个错误。 - AnthonyWJones

1

你可以将当前日期时间附加到 XAP 文件中,这样每次它都会被视为新文件,从而在客户端上不会缓存。

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

希望这能有所帮助。

0

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

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


从技术上讲,不会进行任何缓存失效操作,因为浏览器以前从未见过该URL,因此在缓存中也找不到它。 - AnthonyWJones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接