Asp.net web api 缓存从web api服务返回的图像

Asp.net web api 缓存从web api服务返回的图像,asp.net-web-api,httpresponse,http-status-code-304,image-caching,Asp.net Web Api,Httpresponse,Http Status Code 304,Image Caching,无论我做什么,我都无法从web api缓存中获取返回的图像,每次请求图像时,我都会看到服务器的请求 我尝试了许多头设置权限,以下是我的最新成果: public class TestController : ApiController { public HttpResponseMessage Get(int id) { HttpResponseMessage response = new HttpResponseMessage()

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

我尝试了许多头设置权限,以下是我的最新成果:

  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

内容类型:image/jpeg日期:Sun,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===


有没有关于如何继续的想法?

如果您正在寻找一个200/304的情况,那么在这个阶段您可能错过了最大的一步,那就是您的服务器代码需要选择何时返回一个304,而不是一个完整消息体的200。当满足缓存规则的条件时(您需要决定这些条件是什么),您将需要:

return new HttpResponseMessage(HttpStatusCode.NotModified); // 304
第二部分:

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

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


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

如果希望浏览器能够缓存您的内容,则应将Private=true;如果希望共享缓存缓存内容,则应将public=true。

感谢您花时间回答。但是,必须手动构建304响应似乎并不正确,我想这样做的原因是为了减少对服务器的请求,如果我用正确的头发送了图像,那么在过期之前浏览器甚至不应该发出另一个请求?我根本就不理解这一点。啊,304是对“重新验证”请求的响应。您需要为客户端缓存适当地调整缓存控制,而无需重新验证。第一步是将
MustRevalidate
设置为false,并将
MaxAge
设置为更高的值。在某些情况下,浏览器总是会重新验证。例如,在图像上,通过
img
元素上的
src
指定它将显示一种行为,但直接在地址栏中键入URL可能会引发不同的操作。