在使用 Silverlight 时,我注意到 Firefox 会缓存 XAP 文件,因此如果我进行更新,用户可能会被困在旧版本中。有没有办法强制浏览器每次重新下载 XAP 文件,或者只在发布更新后强制浏览器重新下载?还是在 Silverlight 配置中有一个停止浏览器缓存 XAP 文件的设置?
谢谢, Jeff
在使用 Silverlight 时,我注意到 Firefox 会缓存 XAP 文件,因此如果我进行更新,用户可能会被困在旧版本中。有没有办法强制浏览器每次重新下载 XAP 文件,或者只在发布更新后强制浏览器重新下载?还是在 Silverlight 配置中有一个停止浏览器缓存 XAP 文件的设置?
谢谢, Jeff
查询字符串完美地工作,但我不会使用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 %>" />
这是我在PHP中所做的事情。您可以读取XAP文件的日期/时间,并将其附加为下载链接的参数。通过这种方式,浏览器将新文件版本视为新链接,因此不会缓存。
<?php $fdate = date("dHis",filemtime("MyApp.xap")) ?>
<param name="source" value="MyApp.xap?=<?php echo $fdate ?>"/>
简单易用且可靠。当没有更新需要下载时,浏览器会正确缓存。
对我来说,最好的答案来自Chris Cairns。我稍微改编了一下,调用了ToString和GetHashCode,生成一个时间戳的ID:
<param name="source" value="ClientBin/App.xap?<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/App.xap")).ToString().GetHashCode()%>" />
运行良好!
您可能会发现Web作者和站长的缓存教程很有帮助。该文档讨论了客户端和服务器通过哪些缓存进行交互(浏览器、代理、网关),以及如何控制缓存。
您可以发送HTTP头以防止缓存:
Cache-control: no-cache
Pragma: no-cache
对于我来说,为XAP添加时间戳是有效的(我正在使用JavaScript添加SL控件,但这也可以轻松地在内联中完成):
var appTimestamp = '<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/MyApp.xap")) %>';
var source = 'ClientBin/MyApp.xap?appTimestamp=' + appTimestamp;
这经过测试并且可行:
放置这个:
<%
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" />