如何防止Web浏览器缓存Silverlight XAP文件?以编程方式使Silverlight XAP文件从浏览器缓存中过期
我想这样做是发展我不想手动清除浏览器缓存中的原因,我正在寻找一个编程方法服务器端。
如何防止Web浏览器缓存Silverlight XAP文件?以编程方式使Silverlight XAP文件从浏览器缓存中过期
我想这样做是发展我不想手动清除浏览器缓存中的原因,我正在寻找一个编程方法服务器端。
使用IIS管理添加值为no-cache
的自定义标头Cache-Control
。这会让浏览器在使用XAP之前检查任何缓存版本的XAP是最新版本。
在元件添加的查询参数的URL XAP上的HTML页:?
它会被忽略,并且打破了缓存。 在IE8中,也有一些缓存的管理工具: 打开开发工具:
当引用它们的URL是动态生成的,因此可以添加这些引用时,静态资源上的修订号可能非常有效。然而,需要相当多的定制基础设施来动态实现这一点,而开发人员不得不记得手动升级版本号。如果资源在多个地方使用,情况会变得更糟。由于XAP不可能以高频率从个人客户那里请求,所以偶尔的“未修改”响应更为合意。 – AnthonyWJones
创建一个用于处理* .xap文件的自定义http处理程序,然后在处理程序中设置缓存选项。
事情是这样的......
using System;
using System.IO;
using System.Web;
public class FileCacheHandler : IHttpHandler
{
public virtual void ProcessRequest(HttpContext context)
{
if (File.Exists(context.Request.PhysicalPath))
{
DateTime lastWriteTime = File.GetLastWriteTime(filePath);
DateTime? modifiedSinceHeader = GetModifiedSinceHeader(context.Request);
if (modifiedSinceHeader == null || lastWriteTime > modifiedSinceHeader)
{
context.Response.AddFileDependency(filePath);
context.Response.Cache.SetLastModifiedFromFileDependencies();
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.TransmitFile(filePath);
context.Response.StatusCode = 200;
context.Response.ContentType = "application/x-silverlight-app";
context.Response.OutputStream.Flush();
}
else
{
context.Response.StatusCode = 304;
}
}
}
public DateTime? GetModifiedSinceHeader(HttpRequest request)
{
string modifiedSinceHeader = request.Headers["If-Modified-Since"];
DateTime modifiedSince;
if (string.IsNullOrEmpty(modifiedSinceHeader)
|| modifiedSinceHeader.Length == 0
|| !DateTime.TryParse(modifiedSinceHeader, out modifiedSince))
return null;
return modifiedSince;
}
}
的解决方案呈现here有点类似于迈克尔的,但是是自动的,保证了客户总是会得到一个新的版本。根据您的情况,此可能效率低下。
由于拉斯说,在他comments that he is not on Stack Overflow,我在这里复制的响应。
<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);
%>
....
</object>
我给了这个方法一个去,虽然我可以调试并看到正确构建的'参数',Response.Write写在我的例子
呃......那很奇怪。也许你可以Response.Write整个对象标签,包括参数? – Jedidja
确实很奇怪,我想把所有的东西都写出来,这是我做的。似乎有一个我们正在使用的框架,它不处理它们在aspx/Response流中的位置处的response.writes。会向他们打电话,看他们是否能指出我的写作方向。感谢您的回应 – dougajmcdonald
那么上述所有例子依赖于不缓存包含新把戏XAP名的HTML浏览器....所以你只需动的问题到别的东西。 而且他们也恶魔般的复杂....
然而,对于调试情况下,至少,它很容易编写<对象>和<PARAM> JavaScript代码,以便名称更改每个HTML页面是时候使用,无论是否由浏览器缓存!
<script type="text/javascript">
document.write('<object blah blah >');
document.write('<param name="Source" value="myapp.xap?'
+ new Date().getTime()+'">');
document.write('</object>');
</script>
这回避你可能有控制服务器设置和使用的作品一样好,无论服务器技术的任何麻烦。
注意:您必须编写整个对象组用同样的方法,因为把一个脚本标记物标记中意思是“只有这样做,如果浏览器犯规支持对象
我添加了一个查询PARM到xap文件的路径,以便我可以通过版本控制来管理它。
Default.aspx的代码:
<param
name="source"
value="ClientBin/MySilverLightApp.xap?xapid<%=XapID %>" />
Default.aspx.cs代码:
protected string XapID
{
get
{
Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
if (System.Diagnostics.Debugger.IsAttached)
Response.Write(string.Format("Build: {0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString()));
return string.Format("{0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString()
}
}
这不是很罕见碰上.XAP缓存,这意味着每次您部署新版本的Silverlight应用程序,浏览器不会下载更新的.XAP文件。
一个解决方案可能是更改IIS属性。您可以通过以下步骤打开你的.xap文件“启用内容过期的HTTP标头”选项:
这样,当你刷新页面,而无需关闭浏览器的最新.XAP(仅当有一个最新的.xap文件)将得到下载。
希望这会有所帮助!
这是一个很好的回应,比很多其他人都好(我已经看到你在这里多次给出这个答案。)我是网络开发新手,但在阅读下面的教程后,我可以看到这正是是XAP缓存所必需的。这确实是一个很好的解决方案。 [缓存教程](http://www.mnot.net/cache_docs/) –
这不会强制浏览器永不缓存XAP?还是它确保它只在XAP相同时才缓存? –
有没有办法通过Web.Config来做到这一点?我的项目托管在服务器上,我无法访问IIS管理。 – Marlon