asp.net - ASP.NET 中 HTTP 缓存相关 header 的有效含义

标签 asp.net http caching

我正在开发一个 ASP.NET 2.0 网络应用程序,它涉及通过资源处理程序 (.ashx) 提供图像服务。我刚刚实现了处理缓存 header 和条件 GET 请求,这样我就不必为每个请求提供所有图像。但我不确定我是否完全理解浏览器缓存发生了什么。

图像是通过像 http://www.mysite.com/image.ashx?imageID=3 这样的 url 获取的。我在处理程序中的代码如下所示:

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;
  }
}

这是第一次请求图像时响应 header 的样子:

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 响应并从缓存中提取图像,这非常棒。但是有没有办法让它始终从缓存中提取数据,甚至不询问服务器,直到 header 的最大使用期限(或到期日期)过去?我试过使用 context.Response.Cache.SetExpires() 和 future 的日期,浏览器仍然发出条件 GET 请求。

最佳答案

当您按下 F5 或 Reload 时,Firefox 将始终发送条件请求。

如果您正常导航到页面(例如,单击链接或使用地址栏),它将直接进入缓存。

关于asp.net - ASP.NET 中 HTTP 缓存相关 header 的有效含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037439/

相关文章:

java - 用于线程安全的未绑定(bind)缓存的 ThreadLocal HashMap 与 ConcurrentHashMap

asp.net-mvc - 启用/禁用每个 Controller /操作方法的 session 状态

c# - 具有动态生成输入控件的转发器的 ASP.NET 表单

java - 如何在java中使用Map<String, String>构造复杂的json结构

json - 使用 JSON 的 Pentaho HTTP Post

java - JSoup 抛出 IO 异常 : Too many redirects occurred trying to load URL

http - 如何阻止 chrome 缓存来自 WebApi 的 REST 响应?

c# - 如何将 DataSource 设置为 DropDownList?

.net - ASP.NET 检测 SVG 功能服务器端

c# - Asp.Net WebApi 继承与 BaseController