2

无论我做什么,我都无法从 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 检查时响应标头的样子:

缓存控制:必须重新验证,最大年龄 = 60 内容长度:24233

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

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

X-Powered-By:ASP.NET

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

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

4

2 回答 2

2

如果您正在寻找 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 + 正文 + 新 ETag 或 304。

于 2013-04-14T22:49:53.920 回答
0

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

于 2013-04-15T11:13:48.737 回答