我正在尝试使用支持缓存和条件GET的WCF实现REST Web服务。
我按照MSDN: Caching Support for WCF Web HTTP Services中的说明实现了基本缓存。这意味着为我的每个网络方法添加[AspNetCacheProfile("MyOutputCacheProfile")]
属性,并向web.config
添加适当的条目。这似乎工作正常:当相同的参数传递给Web方法时,将返回缓存的响应。
然后我通过计算一个ETag值并在响应上设置这个来添加对条件GET的支持:
WebOperationContext.Current.OutgoingResponse.SetETag(myETag);
该sorta有效:我第一次调用web方法时,可以在响应中看到ETag
标题。
但问题是:下次我使用相同的参数调用该Web方法时,会返回缓存的响应,并且缓存的响应不包含ETag
标头。 (如果我等到缓存过期,或者完全禁用缓存,则会正确返回ETag标头。)
那么,有没有办法让缓存的响应包含那个ETag值?
更新:经过一些研究和实验,我发现这样做会导致ETag标头包含在所有缓存的响应中:
HttpContext.Current.Response.Cache.SetETag(myETag);
如果我打电话给那个,那么我就不需要调用相关的WebOperationContext...SetETag()
操作来使一切正常。
这是正确的方法吗?
答案 0 :(得分:0)
如果我错了,请纠正我。休息服务更接近Http和Http缓存说
在HTTP / 1.1中缓存的目的是消除发送的需要 在许多情况下请求,并消除发送满的需要 在许多其他情况下的回应。前者减少了数量 许多运营所需的网络往返;我们用的是 为此目的的“到期”机制(见第13.2节)。后者 降低网络带宽要求;我们使用“验证” 为此目的的机制(见第13.3节)。
Asp.net缓存不属于此类别中的任何一种(既没有过期也没有验证)。缓存只在Web服务器和IIS上完成,而不是执行方法,发送存储的响应。一些如何不适合RESTful模型。
要实现缓存,我们应该将Cache Control Headers和Etag添加到响应头,然后尝试处理条件Get。请参阅此优秀的article。