3

我有一个自定义处理程序将图像返回到浏览器。

图像是从数据库中获取的。

由于某种原因,浏览器没有缓存图像,我想知道是否有人能够从下面的代码中发现我缺少的内容:

HttpContext.Current.Response.BinaryWrite(imageBytes);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
Context.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);
if(imgRepGetCache.DateCached.HasValue)
    HttpContext.Current.Response.Cache.SetLastModified(imgRepGetCache.DateCached.Value);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(2));
HttpContext.Current.Response.ContentType = "image/jpeg";

或者,如果我以某种方式完全错过了这一点,并且还有其他地方我需要看。

编辑:根据要求获得更多信息:

  • URL 始终相同
  • 我正在测试通过标准 IIS 管道和我的管道在同一台 PC 上的同一浏览器中加载相同的文件。通常通过 IIS 加载的文件是缓存的,我的文件没有。

编辑 2:检查正常 IIS 路由上的 HTTP 请求/响应后,我认为它与 ETag 有关。ETag(我刚刚才刚接触)似乎是文档的一种校验和。在浏览器的后续请求中,发送 ETag,如果服务器发现 ETag 没有更改,则返回 304 - Not Modified。都好!但我现在使用以下方法设置 ETag:

HttpContext.Current.Response.Cache.SetETag(imgRepGetCache.DateCached.ToString());

但它没有出现在响应中。更近...

编辑 3:在利用 Firebug 获得一些 HTTP 检查乐趣后,我最终修复了它。我在下面发布了我的解决方案。

4

3 回答 3

3

好的,我修好了。

以下是我为其他人所做的以及我自己未来的参考:

// Check for repeated request for the same image from a browser
if (HttpContext.Current.Request.Headers.Get("If-None-Match") == imgRepGetCache.DateCached.Value.ToString())
{
    // Return 304 - Not Modified
    HttpContext.Current.Response.Status = "304 Not Modified";
}
else
{
    if (imgRepGetCache.DateCached.HasValue)
        HttpContext.Current.Response.Headers.Set("Etag", imgRepGetCache.DateCached.Value.ToString());
    // ... do my other stuff here
}

很有魅力!

如果有人在这里发现任何潜在问题,请告诉我,以便我更新。

为了抢占一个明显的 - 我可以 100% 依赖日期字符串来识别图像是否是新的(在我的特定场景中)。

于 2009-06-08T01:22:55.923 回答
0

您在帖子中没有提及任何关于它的内容,但这是 https:// 地址吗?由于安全原因,浏览器不会缓存来自 https 站点的图像和页面。

于 2009-06-08T01:04:01.640 回答
0

在生成响应时您需要担心的事情是:

  • 电子标签
  • 过期

收到请求时需要担心的事情是:

  • 最后修改
  • 如果匹配
  • 如果无匹配
  • If-Modified-Since
  • If-Unmodified-Since
  • 除非-修改-自

您可能还需要担心以下 http 方法:

  • 得到

这是一个应该很容易重构以满足您的需求的解决方案: http ://code.google.com/p/talifun-web/wiki/StaticFileHandler

它从文件系统中读取文件并将它们放入内存中的缓存中,因此只需将其更改为从数据库中读取。应该是一份轻松的工作。

于 2010-02-18T16:59:13.203 回答