使用Silverlight时,我注意到Firefox会缓存XAP文件,因此如果我进行更新,用户可能会使用过时的版本。有没有办法强制浏览器每次都重新下载XAP文件,或者只是在更新发布后才强迫它?或者Silverlight配置中是否有设置阻止浏览器完全缓存XAP文件?
谢谢, 杰夫
答案 0 :(得分:31)
查询字符串工作正常,但我不会使用 DateTime.Now ,因为它会强制用户每次都重新下载应用程序。相反,我们使用以下内容:
protected void Page_Load(object sender, EventArgs e)
{
var versionNumber = Assembly.GetExecutingAssembly().GetName().Version.ToString();
this.myApp.Source += "?" + versionNumber;
}
这样,您只需在 AssemblyInfo.cs 文件中增加版本号。
答案 1 :(得分:12)
最简单的方法:
<param name="source" value="ClientBin/App.xap?<%= DateTime.Now.Ticks %>" />
答案 2 :(得分:6)
这是我在php中所做的。您读取xap文件的日期/时间,并将其作为参数附加到下载链接。通过这种方式,浏览器将新文件版本视为新链接,因此不在其缓存中。
<?php $fdate = date("dHis",filemtime("MyApp.xap")) ?>
<param name="source" value="MyApp.xap?=<?php echo $fdate ?>"/>
简单而且有效。此外,当没有可下载的更新时,浏览器会继续正确缓存。
答案 3 :(得分:5)
对我来说,最好的答案来自Chris Cairns。我刚刚调整了一下,调用ToString和GetHashCode,为时间戳生成一个ID:
<param name="source" value="ClientBin/App.xap?<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/App.xap")).ToString().GetHashCode()%>" />
工作得很好!
答案 4 :(得分:4)
您可能会发现Caching Tutorial for Web Authors and Webmasters很有帮助。本文档讨论了客户端和服务器交互的不同高速缓存(浏览器,代理,网关)以及如何控制高速缓存。
答案 5 :(得分:3)
您可以发送HTTP标头以防止缓存:
Cache-control: no-cache
Pragma: no-cache
如何执行此操作取决于您正在使用的Web服务器。
答案 6 :(得分:2)
另一种解决方案是附加XAP文件的版本而不是时间戳。时间戳每次都会改变(也可能会关闭缓存)。要使其仅在XAP更新时更改,将从XAP文件中获取一些信息。 我还在调查我可以使用的内容,也许是XAP文件的最后修改日期戳?
答案 7 :(得分:2)
为XAP添加XAP的时间戳(我在javascript中添加SL控件,但这可以很容易地在内联中完成):
var appTimestamp = '<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/MyApp.xap")) %>';
var source = 'ClientBin/MyApp.xap?appTimestamp=' + appTimestamp;
答案 8 :(得分:2)
经过测试和运作:
把这个:
<%
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" />
答案 9 :(得分:1)
我通过以上建议的组合来实现这一目标:
在后面的代码中设置ASP.NET Silverlight控件的Source属性,将时间戳附加到.xap url,例如
Silverlight1.Source =“ClientBin / MyApplication.xap?” + DateTime.Now.ToString(“dd-MM-yy-HH:mm:ss”);
答案 10 :(得分:1)
您可以使用XAP文件的最后写入日期在源标记中附加源URL。检查我blog的代码。
答案 11 :(得分:0)
到目前为止,我发现问题的唯一解决方案是清除Firefox缓存。
更好的解决方案会好得多。
答案 12 :(得分:0)
我有这个问题,所以现在当我启动一个新的应用程序时,我将程序集版本设置为0.0.0.1并在每次部署时只更新一个,似乎已经解决了它。然后在发布时将其设置回1.0.0.0。
答案 13 :(得分:0)
一个超级简单的想法:只需在网址中添加一个假查询字符串。
<param name="source" value="app.xap?r12345"/>
大多数服务器应该忽略它并正常服务文件 - 取决于您的服务器。如果您变得非常聪明,可以使托管页面动态化并自动将滴答计数或日期时间字符串附加到查询字符串。这可确保您在需要时获得缓存,但在发生更改时强制下载。
理想情况下,您的服务器应该为您执行此操作。但如果不是......
答案 14 :(得分:0)
我们也处于相同的情况,我们希望控制.XAP文件何时下载到浏览器。
您可能希望查看的方法是使用Silverlight Isolated Storage作为“缓存”来存储.XAP文件。
答案 15 :(得分:0)
<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"
答案 16 :(得分:-1)
查询字符串的想法在Silverlight 4中对我不起作用。服务器似乎缓存了darned xap(尽管不是aspx文件)。在SL4中运行的解决方案是转到Silverlight项目的属性,转到程序集信息并输入版本。