我正在尝试使用支持缓存和条件 GET 的 WCF 实现 REST Web 服务。
我按照MSDN中的说明实现了基本缓存:Caching Support for WCF Web HTTP Services 。这意味着[AspNetCacheProfile("MyOutputCacheProfile")]
为我的每个 web 方法添加一个属性并将适当的条目添加到web.config
. 这似乎工作正常:当将相同的参数传递给 Web 方法时,将返回缓存的响应。
然后,我通过计算 ETag 值并将其设置在响应中,添加了对 Conditional GET 的支持,如下所示:
WebOperationContext.Current.OutgoingResponse.SetETag(myETag);
这种方法有效:我ETag
第一次调用 web 方法时可以在响应中看到标题。
但问题是:下次我使用相同的参数调用该 Web 方法时,会返回一个缓存的响应,并且缓存的响应不包含ETag
标头。(如果我等到缓存到期,或完全禁用缓存,则 ETag 标头会正确返回。)
那么,有没有办法让缓存的响应包含该 ETag 值?
更新:经过更多的研究和实验,我发现这样做会导致 ETag 标头包含在所有缓存的响应中:
HttpContext.Current.Response.Cache.SetETag(myETag);
如果我调用它,那么我不需要调用相关的WebOperationContext...SetETag()
操作来使一切正常。
这是这样做的正确方法吗?