如何阻止chrome从WebApi缓存REST响应?

aut*_*ton 12 rest caching http browser-cache asp.net-web-api

我正在使用ASP.NET WebApi并使用以下代码来阻止所有内容中的缓存:

public override System.Threading.Tasks.Task<HttpResponseMessage> ExecuteAsync(System.Web.Http.Controllers.HttpControllerContext controllerContext, System.Threading.CancellationToken cancellationToken)
{
    System.Threading.Tasks.Task<HttpResponseMessage> task = base.ExecuteAsync(controllerContext, cancellationToken);
    task.GetAwaiter().OnCompleted(() =>
                                      {
                                          task.Result.Headers.CacheControl = new CacheControlHeaderValue()
                                          {
                                              NoCache = true,
                                              NoStore = true,
                                              MaxAge = new TimeSpan(0),
                                              MustRevalidate = true
                                          };
                                          task.Result.Headers.Pragma.Add(new NameValueHeaderValue("no-cache"));
                                          task.Result.Content.Headers.Expires = DateTimeOffset.MinValue;
                                      });
    return task;
}
Run Code Online (Sandbox Code Playgroud)

结果标题看起来像这样(chrome):

Cache-Control:no-store, must-revalidate, no-cache, max-age=0
Content-Length:1891
Content-Type:application/json; charset=utf-8
Date:Fri, 19 Jul 2013 20:40:23 GMT
Expires:Mon, 01 Jan 0001 00:00:00 GMT
Pragma:no-cache
Server:Microsoft-IIS/8.0
Run Code Online (Sandbox Code Playgroud)

在阅读了有关错误(如何阻止缓存中的chrome)之后,我添加了"no-store" .

但是,无论我做什么,当我做一些导航我远离此页面的东西,然后使用"后退"按钮时,chrome总是从缓存中加载:

Request Method:GET
Status Code:200 OK (from cache)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?我已经确认服务器永远不会被这个请求命中.

aut*_*ton 7

答案是Chrome不喜欢"Expires:Mon,01 Jan 01 00 00:00:00 GMT"(基本上是假日期).

我将我的日期更改为他们在Google API中使用的日期,并且有效:

Cache-Control:no-store, must-revalidate, no-cache, max-age=0
Content-Length:1897
Content-Type:application/json; charset=utf-8
Date:Fri, 19 Jul 2013 20:51:49 GMT
Expires:Mon, 01 Jan 1990 00:00:00 GMT
Pragma:no-cache
Server:Microsoft-IIS/8.0
Run Code Online (Sandbox Code Playgroud)

因此,对于遇到此问题的任何其他人,请确保将过期日期设置为此任意日期!

  • 您链接到的错误报告与他创建的第二个错误报告一起关闭,因为OP不了解缓存是如何工作的.Chrome团队和从事鱿鱼等代理服务的人员都非常积极地参与IETF的工作.您链接的SO帖子只是人们不仔细阅读规范的更多例子. (3认同)
  • 我建议阅读有关该主题的官方文档http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-23#section-7.2.2 (2认同)
  • IETF?真?这就像把我指向w3c那样'适当'.让我们记住,这是商业,在商业中,什么是正确的,重要的是什么是有效的.并且很明显当前的浏览器实现并不遵循IETF所说的'正确' (2认同)