这是问题所在:
我的 Silverlight 应用程序正在使用 WebClient 调用名为 getCampaigns 的 HTTP Web 服务,该服务返回 Campaign 对象的 JSON 数据数组。然后,用户可以与请求的对象进行交互,修改它们、删除它们等。当用户删除活动时,Silverlight 会调用另一个 Web 服务,该服务会在数据库中标记该对象,以便将来不会返回该对象,并且然后通过调用 getCampaigns 刷新页面。问题是已删除的活动仍然显示。
如果我检查数据库,该活动确实已被禁用,如果我关闭 Silverlight 应用程序并重新启动它,则该活动不会出现。 Silverlight 似乎正在缓存 Web 服务调用。但每次调用时都会实例化一个新的 WebClient 对象。
有任何想法吗?
Silverlight 中的任何 HTTP GET 请求都会被缓存,因此如果您想消除客户端浏览器的缓存,请使用 HTTP POST 来进行 Web 服务调用。例如,在 WCF RIA 域服务中,将您的调用和查询方法标记为:
[Invoke(HasSideEffects = true)]
[Query(HasSideEffects = true)]
HasSideEffects只是简单地声明它应该使用POST方法来避免客户端GET的缓存机制。请记住,SL 默认情况下使用浏览器进行 Web 服务调用,并且默认情况下使用可缓存的 GET。这就是为什么您的 Web 服务调用甚至在 RIA 之外的服务也会被缓存:浏览器看到您使用 HTTP GET 并缓存结果。
默认情况下对 Web 服务调用使用 GET 是出于性能原因,因为根据 RFC 2616,所有主要浏览器都无法缓存 POST 响应,RFC 2616 规定 POST 应该是幂等操作(又名总是会产生预期结果,但缓存会中断,因为结果可能会随着时间的推移而改变)。
RIA 中的其他操作包括使用 LoadOperations 上的 LoadBehavior 设置缓存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)