在我们的 Asp.Net 应用程序中,我们有一个 IHttpHandler 处理图像请求。Handler 使用一个特殊的 id 来调用,该 id 标识了我们的图像缓存中的图像。一旦图像投入现金,它就永远不会改变。我的问题是:
是否可以始终为带有“If-Modified-Since”标头的请求返回 http 状态代码 304,而无需实际检查给定日期?原因是浏览器必须已经拥有图像的副本(因为它提供了 modified-since 标头)。
这将使生活更轻松,因为我们(还)不跟踪图像创建日期。
这是实际代码(更新:我现在按照 Aristos 的建议在服务器响应中包含了 if-modified 标头):
public void ProcessRequest(HttpContext context)
{
if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"])) {
//Is this okay?
context.Response.StatusCode = 304;
context.Response.StatusDescription = "Not Modified";
return;
}
var thumbnailId = context.Request.QueryString["thumbnail"];
using (var thumbnailCache = new CThumbnailCache()) {
var imageBytes = thumbnailCache.GetImageById(thumbnailId);
context.Response.ContentType = "image/png";
var outputStream = context.Response.OutputStream;
outputStream.Write(imageBytes, 0, imageBytes.Count());
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetLastModified(DateTime.UtcNow);
// added after Aristos post
context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString("r"));
const int maxAge = 86400 * 14; // 14 Tage
context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(maxAge));
context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, maxAge));
context.Response.CacheControl = "private";
context.Response.Cache.SetValidUntilExpires(true);
}
}