0

我正在尝试使用支持缓存和条件 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()操作来使一切正常。

这是这样做的正确方法吗?

4

1 回答 1

0

如果我错了,请纠正我。Restful 服务更接近 Http 和 Http 缓存说

HTTP/1.1 中缓存的目标是在许多情况下消除发送请求的需要,并在许多其他情况下消除发送完整响应的需要。前者减少了许多操作所需的网络往返次数;为此,我们使用“过期”机制(参见第 13.2 节)。后者降低了网络带宽需求;为此,我们使用“验证”机制(参见第 13.3 节)。

Asp.net 缓存不属于此类(既不过期也不验证)。缓存仅在 Web 服务器和 IIS 上完成,而不是执行该方法,发送存储的响应。有些不适合 RESTful 模型。

为了实现缓存,我们应该将Cache Control Headers和Etag添加到响应头中,然后尝试处理条件Get。请查阅这篇优秀的文章

于 2012-06-19T16:51:31.687 回答