防止您的 Silverlight XAP 文件在浏览器中缓存
本文介绍如何防止Silverlight XAP文件在浏览器中缓存。
引言
如果您每天都使用Silverlight,那么您肯定遇到过这个问题。您的XAP文件已缓存在浏览器中,您必须清空浏览器缓存才能解决它。这对您和您的客户来说都非常令人沮丧。您通常可以通过以下方法解决:
转到“选项” -> “清除浏览历史记录” -> “清空缓存”,最后点击“清除浏览数据”。

步骤太多了。
如您所见,这些步骤太多了,完全没有必要。当您的客户说:“我看不到您刚实现的新功能!”,而您意识到这是缓存的xap文件问题时,情况就更糟了。我一直在努力寻找一种方法来防止我的XAP文件在浏览器中缓存,并决定实现以下解决方案。
- 如果附加了Visual Studio调试器,则向source参数添加唯一的查询字符串以**强制**刷新XAP文件。
- 如果没有附加Visual Studio调试器,则按Visual Studio生成的样式添加source参数。这也是为了避免忘记在我的生产环境中删除上述代码。
- 我希望ASP.NET代码与我的.ASPX页面内联。(我不希望附加到.aspx页面的单独的代码隐藏.cs页面或.vb页面)。
查看Visual Studio生成的默认页面
以下是创建新的Silverlight项目时生成的宿主代码示例。快速回顾一下,硬编码的参数名称 = “source”指定了XAP文件的位置。
<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 name="source" value="ClientBin/SilverlightApplication2.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50826.0" />
<param name="autoUpgrade" value="true" />
<a href=http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.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>
那么,我们该如何改进呢?
我们将使用一些内联ASP.NET来动态生成参数名称 = source,以防止XAP文件缓存。让我们看看完整的解决方案
<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%">
<%
string strSourceFile = @"ClientBin/SilverlightApplication2.xap";
string param;
if (System.Diagnostics.Debugger.IsAttached)
//Debugger Attached - Refresh the XAP file.
param = "<param name=\"source\" value=\"" + strSourceFile + "?" +
DateTime.Now.Ticks + "\" />";
else
{
//Production Mode
param = "<param name=\"source\" value=\"" + strSourceFile + "\" />";
}
Response.Write(param);
%>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50826.0" />
<param name="autoUpgrade" value="true" />
<a href=http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.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>
我们将XAP文件的位置添加到strSourceFile
,如果附加了调试器,它将DateTime.Now.Ticks
附加到XAP文件源,并强制浏览器下载.XAP文件。如果您查看Silverlight应用程序的页面源代码,则可以通过查看参数名称 = “source”标签来验证其是否正常工作,如下所示

<span class="Apple-style-span" style="font-size: 11px; line-height: normal; ">
<param name="source" value="ClientBin/SilverlightApplication2.xap?634299001187160148" />
</span>
如果没有附加调试器,它将使用标准的source标签,如下所示
<param name="source" value="ClientBin/SilverlightApplication2.xap"/>
如果我想在我的生产Silverlight应用程序中使用此功能怎么办?
此时您可能会问,如何防止我的XAP文件在我的生产应用程序中被缓存?嗯,您有两个简单的选择
- 我不太推荐这种方法,但您可以使用以下代码片段强制每次刷新XAP:
<param name="source" value="ClientBin/SilverlightApplication2.xap?<%=Guid.NewGuid().ToString() %>"/>
**注意**:您也可以将“
Guid.NewGuid().ToString()
”替换为任何生成随机字段的内容。(我之前使用了DateTime.Now.Ticks
)。 - 我更喜欢另一种解决方案,它涉及检查XAP创建日期并将其附加到参数名称 = source。此方法由Lars Holm Jenson描述。
<%
string strSourceFile = @"ClientBin/SilverlightApplication2.xap";
string param;
if (System.Diagnostics.Debugger.IsAttached)
param = "<param name=\"source\" value=\"" + strSourceFile + "\" />";
else
{
string xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + strSourceFile;
DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xappath);
param = "<param name=\"source\" value=\"" + strSourceFile + "?ignore="
+ xapCreationDate.ToString() + "\" />";
}
Response.Write(param);
%>
如您所见,这个问题已经解决了。它适用于所有Web浏览器和顽固的缓存.XAP文件的代理服务器。
我喜欢您的文章,在哪里可以找到更多文章?
如果您喜欢这篇文章,请查看我的博客以获取更多类似的文章。您可能还想订阅我的博客或关注我的Twitter。
历史
- 2011年1月6日:初始发布