0

基本上我想做的是一个完整的服务器端缓存,并禁用客户端缓存。

[OutputCache(Duration = 3600)]
public ActionResult getImage(string imagePath)
{
    Response.AddFileDependency(imagePath);
    return base.File(imagePath, "image/jpg");
}

当“刷新”页面时,缓存工作得很好。它返回“状态:304 Not-Modified”,并在手动更改文件时切换到“状态:200”。

但是,当通过超链接(RedirectToAction)从另一个页面访问来呈现页面时,或者通过单击 url 栏并按 enter 来呈现页面时,即使文件已更改,它也会返回“状态:200(缓存)”。

我尝试了以下组合

  • Response.Cache.SetETagFromFileDependencies();
  • Response.Cache.SetLastModifiedFromFileDependencies();
  • Response.Cache.SetCacheability(HttpCacheability.Server);
  • Response.Cache.VaryByHeaders["If-None-Match"] = true;

但没有任何效果。

如果有人能引导我找到解决方案,那就太好了。

4

1 回答 1

0

我解决了!

public ActionResult getImage(string imagePath)
{
    return EtagFix(System.IO.File.GetLastWriteTime(imagePath).ToString(), HttpCacheability.Public, TimeSpan.FromHours(0)) ?? base.File(imagePath, "image/jpg");
}

ActionResult EtagFix(string etagResponse, HttpCacheability cachability, TimeSpan maxAge)
{
    var cache = Response.Cache;
    cache.SetETag(etagResponse);
    cache.SetMaxAge(maxAge);
    cache.SetCacheability(HttpCacheability.Public);

    if (!etagResponse.Equals(Request.Headers["If-None-Match"])) return null;

    Response.StatusCode = 304;
    Response.StatusDescription = "Not Modified";
    return new EmptyResult();
}

使用源 http://bloggingabout.net/blogs/ramon/archive/2011/06/16/mvc-always-returns-status-code-200-when-a-max-age-is-set-while-it-可以返回-with-304.aspx

于 2013-07-15T15:40:17.400 回答