【问题标题】:Supporting both ASP.NET Caching and ETag/Conditional GET in WCF WebHttp Service在 WCF WebHttp 服务中同时支持 ASP.NET 缓存和 ETag/Conditional GET
【发布时间】:2012-06-19 15:05:58
【问题描述】:

我正在尝试使用支持缓存和条件 GET 的 WCF 实现 REST Web 服务。

我按照MSDN: Caching Support for WCF Web HTTP Services 中的说明实现了基本缓存。这意味着将[AspNetCacheProfile("MyOutputCacheProfile")] 属性添加到我的每个Web 方法,并将适当的条目添加到web.config。这似乎工作正常:当将相同的参数传递给 Web 方法时,将返回缓存的响应。

然后我通过计算 ETag 值并将其设置在响应中,添加了对条件 GET 的支持,如下所示:

WebOperationContext.Current.OutgoingResponse.SetETag(myETag);

这种方法有效:我第一次调用 Web 方法时可以在响应中看到 ETag 标头。

但问题是:下次我使用相同的参数调用该 Web 方法时,会返回一个缓存响应,并且缓存响应不包含 ETag 标头。 (如果我等到缓存过期,或者完全禁用缓存,则 ETag 标头会正确返回。)

那么,有没有办法让缓存的响应包含该 ETag 值?


更新:经过更多的研究和实验,我发现这样做会导致 ETag 标头包含在所有缓存的响应中:

HttpContext.Current.Response.Cache.SetETag(myETag);

如果我调用它,那么我不需要调用关联的WebOperationContext...SetETag() 操作来使一切正常。

这是正确的做法吗?

【问题讨论】:

    标签: asp.net wcf caching rest


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-29
      • 1970-01-01
      • 2013-08-13
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2010-12-16
      • 1970-01-01
      相关资源
      最近更新 更多