无论我做什么,我都无法从 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/