ste*_*n.s 6 silverlight caching wcf-ria-services
正如在另一个问题中提到的,我们在项目中结合Silverlight导航框架使用WCF-RIA服务.部分是搜索功能.搜索按钮将导航到特殊搜索页面,将搜索查询放入URL,然后在服务器上触发RIA请求.
对于此请求,我们使用此属性启用了客户端输出缓存:
[OutputCache(OutputCacheLocation.Client, duration: 2 * 60)]
Run Code Online (Sandbox Code Playgroud)
现在,有时(特别是在演示中)我们的用户知道,底层数据源已经改变,他们想要刷新搜索以查看当前结果.
设置LoadOperations LoadBehavior不会刷新缓存.
现在我们有一个(部分)解决方案:我们为我们的服务添加了一个特殊的缓存计数器属性.该属性被服务忽略,仅用于解决缓存问题.每当用户点击搜索按钮时,缓存计数器就会增加,我们会在缓存中工作.如果用户向后或向前导航到搜索页面,则从Url检索搜索计数器,并且该请求由缓存提供.
现在的问题是:是否有更好的方法来强制刷新客户端缓存?
此外:如果用户选择浏览器刷新按钮刷新搜索页面,我们的解决方法将失败.在这种情况下,缓存计数器仍然从URL中获取,并且从缓存而不是服务器检索数据.我发现没有办法从我们的Silverlight客户端检测刷新(我已经看到一个使用服务器端会话变量的建议,这不是一个选项,因为我们的服务器是完全无状态的).
我们遇到了完全相同的问题,因此我们在所有“获取”方法中声明了一个称为版本的通用参数,版本是在 silverlight 应用程序启动时选择的随机数。单击刷新按钮时,版本会更改并刷新缓存。当用户单击浏览器上的刷新按钮时,silverlight 将重新启动并选择新的随机版本。对于每个后续的下一个/上一个版本变量将保持不变。
样本:
public IQueryable<Products> GetProducts(
string name,
// ignore following
int version )
{
Return ....
}
Run Code Online (Sandbox Code Playgroud)
基本上不同的版本号标识不同的 URL,因此浏览器或 http 客户端会忽略缓存并刷新结果。