WCF-RIA服务客户端输出缓存 - 如何强制刷新缓存

6
另一个问题中所述,我们在项目中结合Silverlight导航框架使用WCF-RIA服务。其中一部分是搜索功能。点击搜索按钮将导航到特殊的搜索页面,并将搜索查询放入URL中,然后触发服务器上的RIA请求。

为了进行此请求,我们使用以下属性启用了客户端输出缓存:

[OutputCache(OutputCacheLocation.Client, duration: 2 * 60)]

现在有时候(特别是在演示中),我们的用户知道底层数据源已经更改,他们希望刷新搜索以查看当前结果。

设置LoadOperations LoadBehavior无法刷新缓存。

目前我们有一个(部分)解决方案:我们向服务添加了一个特殊的缓存计数器属性。该属性被服务忽略,仅用于解决缓存问题。每当用户单击搜索按钮时,缓存计数器会增加,我们就可以绕过缓存。如果用户返回或前进到搜索页面,则从Url检索搜索计数器,并通过缓存提供请求。

现在的问题是:是否有更好的方法来强制刷新客户端缓存?

此外:如果用户选择浏览器刷新按钮刷新搜索页面,则我们的解决方案会失败。在这种情况下,缓存计数器仍然从url中获取,并且数据从缓存而不是服务器中检索到。我找不到一种方法来检测来自silverlight客户端的刷新(我看到有一个建议使用服务器端会话变量,但这不是一个选项,因为我们的服务器完全无状态)。

1个回答

4
我们曾经遇到过完全相同的问题,所以我们在所有“Get”方法中声明了一个名为“version”的公共参数,并且“version”是在Silverlight应用程序启动时选择的随机数。当刷新按钮被点击时,“version”将被更改并刷新缓存。当用户在浏览器上点击刷新按钮时,由于Silverlight将被重新启动,因此将选择一个新的随机版本。对于每个后续的下一个/上一个版本,变量将保持不变。
示例:
public IQueryable<Products> GetProducts(
    string name, 
    // ignore following
    int version )
{
   Return ....
}

基本上,不同的版本号标识不同的URL,因此浏览器或http客户端会忽略缓存并刷新结果。

谢谢,好主意!我会尝试将其与我们的解决方案结合起来。 - stefan.s
你好,能否发布您的版本号示例代码呢?我有同样的问题,但尚无解决方案。谢谢。 - KentZhou

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