asp.net-web-api - 缓存从 Web api 服务返回的图像

标签 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();

            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 检查时响应 header 的样子:

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

Content-Type:image/jpeg Date:Sun, 14 Apr 2013 22:04:32 GMT

Server: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 相当简单。比较日期,如果自 LastModified 日期以来资源已被修改,则返回完整响应,否则返回 304。

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

关于asp.net-web-api - 缓存从 Web api 服务返回的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004917/

相关文章:

asp.net-core - 如何在 .net6 中使用 WebApplicationFactory(没有口语入口点)

c# - 使用 web api 将自定义异常序列化为 JSON

spring - 为什么使用 HttpServletRequest 向浏览器发送响应?

http - 浏览器是否应该自动处理 304 响应?

unit-testing - 单元测试后 Controller .NET Web Api

javascript - 使用 Web Api Controller 参数映射 AngularJs 查询字符串

java - android HttpResponse 总是在第二次调用时死掉

c# - 在 C# 中解析原始 HTTP 响应以获取状态代码

http - 如果不需要更新,用 304 响应非条件 PUT 是否正确?

java - 静态资源更改时 Play Framework 回复未修改