在WCF WebHttp服务中支持ASP.NET缓存和ETag /条件GET

时间:2012-06-19 15:05:58

标签: asp.net wcf caching rest

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

这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

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

  

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

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

要实现缓存,我们应该将Cache Control Headers和Etag添加到响应头,然后尝试处理条件Get。请参阅此优秀的article