【发布时间】:2012-02-20 16:29:07
【问题描述】:
我正在开发 ASP.NET 2.0 中的 Web 应用程序,该应用程序涉及通过资源处理程序 (.ashx) 提供图像。我刚刚实现了处理缓存标头和条件 GET 请求,因此我不必为每个请求提供所有图像。但我不确定我是否完全了解浏览器缓存的情况。
图片是通过http://www.mysite.com/image.ashx?imageID=3 等网址获取的。我在处理程序中的代码如下所示:
int imageID = -1;
try
{
imageID = Int32.Parse(context.Request["imageID"]);
}
catch (Exception) {}
MyImageClass image = DataLayer.GetImage(imageID);
if (image != null)
{
DateTime requestedDate = DateTime.MinValue;
if (context.Request.Headers["If-Modified-Since"] != null)
{
requestedDate = DateTime.Parse(context.Request.Headers["If-Modified-Since"])
.ToLocalTime();
}
if (requestedDate < image.ModifiedDate)
{
context.Response.AddHeader("content-type", image.ContentType);
context.Response.CacheControl = HttpCacheability.Private.ToString();
context.Response.Cache.SetLastModified(image.ModifiedDate.ToUniversalTime());
context.Response.Cache.SetMaxAge(TimeSpan.FromDays(1));
//write image to output stream
}
else
{
context.Response.StatusDescription = "Not Modified";
context.Response.StatusCode = 304;
}
}
这是第一次请求图像时响应标头的样子:
HTTP/1.1 200 OK
Cache-Control: private, max-age=86400
Content-Length: 1048576
Content-Type: image/jpeg
Expires: Sat, 28 Jan 2012 17:17:11 GMT
Last-Modified: Fri, 27 Jan 2012 16:50:27 GMT
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Fri, 27 Jan 2012 17:17:10 GMT
这是对后续请求的响应:
HTTP/1.1 304 Not Modified
Cache-Control: private
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Fri, 27 Jan 2012 17:17:30 GMT
Connection: close
观察 Fiddler 中的请求,我注意到浏览器 (Firefox 9) 总是在第一次请求后对图像发出条件 GET 请求。它得到304 Not Modified 响应并从缓存中提取图像,这很棒。但是有没有办法让它总是从缓存中提取,甚至不询问服务器,直到标头的最大年龄(或到期日期)过去之后?我已经尝试使用带有未来日期的context.Response.Cache.SetExpires(),但浏览器仍然会发出有条件的 GET 请求。
【问题讨论】:
-
你应该调用
TryParse而不是使用catch。 -
@Slaks - 很好,我以后会这样做。