你如何强迫Firefox不caching或重新下载Silverlight XAP文件?

在使用Silverlight的时候,我注意到Firefox会cachingXAP文件,所以如果我做了一个更新,用户可能会使用过时的版本。 有没有办法强制浏览器每次重新下载XAP文件,或者只是在更新发布后强制执行? 还是有一个在Silverlightconfiguration的设置,停止浏览器cachingXAP文件?

谢谢,杰夫

查询string完美工作,但我不会使用DateTime.Now ,因为它迫使用户每次重新下载应用程序。 相反,我们使用以下内容:

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

这样你所要做的就是在AssemblyInfo.cs文件中增加版本号。

最简单的方法:

 <param name="source" value="ClientBin/App.xap?<%= DateTime.Now.Ticks %>" /> 

这是我在做什么。 您读取xap文件的date/时间,并将其作为参数附加到下载链接。 这样浏览器会将新的文件版本视为新的链接,因此不在其caching中。

 <?php $fdate = date("dHis",filemtime("MyApp.xap")) ?> <param name="source" value="MyApp.xap?=<?php echo $fdate ?>"/> 

简单,它的作品。 另外,浏览器在没有下载更新时继续正确caching。

对我来说,最好的答案来自Chris Cairns 。 我刚刚调整了一下,调用ToString和GetHashCode,生成一个ID到时间戳:

 <param name="source" value="ClientBin/App.xap?<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/App.xap")).ToString().GetHashCode()%>" /> 

工作得很好!

您可能会发现Web作者和网站pipe理员的caching教程很有帮助。 本文档讨论客户端和服务器通过哪些不同的caching进行交互(浏览器,代理,网关)以及如何控制caching。

您可以发送HTTP标头以防止caching:

 Cache-control: no-cache Pragma: no-cache 

你如何做到这一点取决于你正在使用的Web服务器。

另一个解决scheme是附加XAP文件的版本,而不是时间戳。 时间戳每次都会改变(不妨closurescaching)。 为了让它只在XAP更新的时候才会从XAP文件中获取一些信息。 我仍在研究可以使用的内容,也许是XAP文件的最后修改date戳记?

添加XAP的时间戳为我工作(我在JavaScript中添加SL控件,但这可以很容易地内联):

 var appTimestamp = '<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/MyApp.xap")) %>'; var source = 'ClientBin/MyApp.xap?appTimestamp=' + appTimestamp; 

这testing和工作:

把这个:

 <% const string sourceValue = @"ClientBin/MyXapFile.xap"; string param; if(System.Diagnostics.Debugger.IsAttached) param = "<param name=\"source\" value=\"" + sourceValue + "\" />"; else { var xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + sourceValue; var xapCreationDate = System.IO.File.GetLastWriteTime(xappath); param = "<param name=\"source\" value=\"" + sourceValue + "?ignore=" + xapCreationDate + "\" />"; } Response.Write(param); %> 

而不是这个:

 <param name="source" value="ClientBin/MyXapFile.xap" /> 

我得到这个工作的上述build议的组合:

  1. 将元标记cache-control / pragma http-equiv属性设置为“No-Cache”
  2. 使用ASP.NET页面来托pipeSilverlight控件(而不是HTML页面)
  3. 在后面的代码中设置ASP.NET Silverlight控件的Source属性,将时间戳添加到.xap url

    Silverlight1.Source =“ClientBin / MyApplication.xap?” + DateTime.Now.ToString(“dd-MM-yy-HH:mm:ss”);

您可以将对象标记中的源URL添加到XAP文件的最后写入date。 检查我的博客上的代码。

当.XAP文件被下载到浏览器时,我们也处于想要控制的情况。

您可能需要考虑的一种方法是使用Silverlight隔离存储作为“caching”来存储您的.XAP文件。

看看这个博客: IsolatedStorage作为一个Silverlight对象caching

一个超级简单的想法:只是添加一个假的查询string的url。

 <param name="source" value="app.xap?r12345"/> 

大多数服务器应该忽略它并正常服务器文件 – 取决于您的服务器。 如果你真的很聪明,你可以使托pipe页面dynamic并自动附加一个滴答计数或date时间string的查询string。 这可确保您在需要时获得caching,但在发生更改时强制下载。

理想情况下,你的服务器应该为你做这个。 但是,如果没有…

我现在有这个问题,所以现在当我启动一个新的应用程序,我将程序集版本设置为0.0.0.1,只是每个部署更新一个,似乎已经解决了我。 然后在发布时将其设置回1.0.0.0。

到目前为止,一旦发生问题,唯一解决方法就是清除Firefoxcaching。

更好的解决scheme会更好。

我使用这个解决scheme

 <object id="Xaml1" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> <%––<param name="source" value="ClientBin/SilverlightApp.xap"/>––%> <% string orgSourceValue = @"ClientBin/SilverlightApp.xap"; string param; if (System.Diagnostics.Debugger.IsAttached) param = "<param name=\"source\" value=\"" + orgSourceValue + "\" />"; else { string xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + orgSourceValue; DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xappath); param = "<param name=\"source\" value=\"" + orgSourceValue + "?ignore=" + xapCreationDate.ToString() + "\" />"; } Response.Write(param); %> <param name="onError" value="onSilverlightError" 

查询string的想法不适用于我在Silverlight 4中。服务器似乎cachingdarned xap(尽pipe不是aspx文件)。 在SL4中工作的解决scheme是去你的Silverlight项目的属性,去组件信息,并在一个版本。