防止代理服务器缓存Silverlight xap文件

6
我所在的公司在国际站点之间设置了代理/WAN加速器来缓存Intranet网页内容。我有一个Silverlight应用程序托管在一个位置的服务器上,但由另一个位置的客户端访问。当用户访问托管Silverlight应用程序的网页时,他们获取的是被代理缓存的旧版本xap文件,而不是来自服务器的最新版本。本地用户总是获取最新的xap文件,因为他们的请求没有经过代理。
我已经尝试了其他地方提到的各种标头/元数据技术来防止缓存,且包含的网页本身也是新鲜的,但我仍然得到旧的.xap文件。除了让我们的IT管理员禁用我的站点的代理缓存外,还有什么方法可以确保从服务器检索到最新的xap文件而不是代理?包含页面是ASP.NET。
2个回答

4
我所做的就是在xap文件路径末尾添加查询字符串。当您更改查询字符串变量时,代理等应该将其视为对新文件的请求。到目前为止,这对我来说一直很好用。
因此,基本上,在将.xap嵌入纯HTML文件时,您需要这样做:
<param name="source" value="ClientBin/SilverlightApplication1.xap?cachepreventer=whatevervalue"/>

然后当您部署新版本时,只需将“whatevervalue”更改为其他值。

编辑
如果您需要在程序中多次使用此技术,建议从配置文件读取查询字符串值,并使用asp.net将其写入页面。这样,在部署时,您只需要在一个地方更新即可。


在我的SL解决方案中,whatevervalue是磁盘上XAP文件的时间戳(刻度数)。我实现了一个小的ASP.NET助手,将时间戳作为查询附加到文件名中。这样,它是完全自动的,您不需要在任何地方更新任何内容--只需将XAP放入ClientBin中,当用户尝试获取它时,它会自动刷新。然后,在ASPX中,我有类似以下的内容: <param name="source" value=" <% = Helper.AppendTimestamp( "ClientBin/SilverlightApp.xap" ) %>" /> - Srdjan Jovcic
这真的很聪明。我可能会决定转换到那种技术。 - Henrik Söderlund

2
如果您想确保每次检索xap文件并且不想担心它 - 只需使用 <param name="source" value="ClientBin/YourSilverlightapp.xap?<%=Guid.NewGuid().ToString() %>"/>
当然 - 这会导致更重的缓存负载。我喜欢上面的辅助方法,如果您只想将更改传播到客户端。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接