【问题标题】:Caching images returned from a web api service缓存从 Web api 服务返回的图像
【发布时间】:2013-04-06 23:04:45
【问题描述】:

无论我做什么,我都无法从 web api 缓存中获取返回的图像,每次我请求图像时都会看到对服务器的请求。

我已经为标题设置尝试了许多 permiations,这是我最近的努力:

  public class TestController : ApiController
    {
        public HttpResponseMessage Get(int id)
        {
            HttpResponseMessage response = new HttpResponseMessage();

            StreamContent streamContent = new StreamContent(File.Open("c:\\1.jpg", FileMode.Open, FileAccess.Read, FileShare.Read));
                    
            response.Content = streamContent;
            response.Content.Headers.Add("Content-Type", "image/jpeg");
            response.Headers.CacheControl = new CacheControlHeaderValue
            {
                MustRevalidate = true,
                Private= false,
                MaxAge = TimeSpan.FromMinutes(1),
            };

            //string hash = new Guid("524DF956-D67A-4D66-A3E0-5E78726A204A").GetHashCode().ToString();
            //response.Headers.ETag = new EntityTagHeaderValue(String.Concat("\"", hash, "\""), true);
            //response.Content.Headers.LastModified = new DateTimeOffset(new DateTime(2012, 12, 24));
            //response.Content.Headers.Expires = new DateTimeOffset(new DateTime(2013, 12, 24));
            return response;
        }

这就是我使用 chrome 检查时响应标头的样子:

Cache-Control:must-revalidate, max-age=60 Content-Length:24233

内容类型:image/jpeg 日期:2013 年 4 月 14 日星期日 22:04:32 GMT

服务器:Microsoft-IIS/8.0 X-AspNet-Version:4.0.30319

X-Powered-By:ASP.NET

X-SourceFiles:=?UTF-8?B?Qzpcc291cmNlXFRydW5rXFRlc3RcYXBpXHRlc3RcMQ==?=

关于如何进行的任何想法?

【问题讨论】:

    标签: asp.net-web-api httpresponse http-status-code-304 image-caching


    【解决方案1】:

    如果您正在寻找 200 / 304 的情况,那么您在此阶段缺少的最大步骤可能是您的服务器代码需要选择何时返回 304,而不是带有完整消息正文的 200。当满足缓存规则的条件(并且您需要确定它们是什么)时,您会想要:

    return new HttpResponseMessage(HttpStatusCode.NotModified); // 304
    

    第 2 部分:

    接下来的选择是决定你的缓存规则。您当前的代码不会比缓存检查的第一步更进一步(即使是这样)。您需要为客户端返回一个LastModified 和/或ETag,然后在后续请求中使用以执行缓存检查。

    LastModified 相当直截了当。比较日期,如果资源自 LastModified 日期以来已被修改,则返回完整响应,否则返回 304。

    ETag 应该唯一地代表资源,不是请求(正如您当前注释掉的 ETag 代码所做的那样)。散列对于 ETag 可能有意义,但前提是它是您要返回的资源的散列,不是,如果它每次都是完全唯一的散列。把它想象成一个时间戳,甚至是版本号。客户端获取图像的版本 1,ETag 值为(假设)“1”。客户端然后发送包含 ETag 值的该图像的请求,服务器然后检查“1”是否仍然是有效版本,并根据需要返回 200 + body + new ETag 或 304。

    【讨论】:

    • 感谢您花时间回答。不得不手动构建 304 响应似乎并不正确,我想这样做的原因是为了减少对服务器的请求,如果我用正确的标题发送图像,浏览器肯定不应该再做另一个请求直到到期期限已过?我是否从根本上错过了理解这一点。
    • 啊,304 是对“重新验证”请求的响应。您需要为客户端缓存适当地调整缓存控制,而无需重新验证。将MustRevalidate 设置为false 并将MaxAge 设置为更高的值将是您的第一步。
    • 在某些情况下浏览器会总是重新验证。例如,在图像上,通过img 元素上的src 指定它会表现出一种行为,但直接在地址栏中输入 URL 可能会引发不同的操作。
    【解决方案2】:

    如果您希望浏览器能够缓存您的内容,您应该设置 Private=true,如果您希望共享缓存来缓存它,您应该设置 public=true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 2017-09-11
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多