2009-06-08 52 views
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:检查HTTP请求后/正常IIS路线上的回答,我认为这是与ETag的。 ETag(我刚刚才了解到)似乎是该文档的一种校验和。在浏览器的后续请求中发送ETag,并且如果服务器发现ETag没有改变,则它返回304-未修改。都好!但我现在正在设置ETag使用:

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

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

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

+0

您应该发布更多信息。有时,浏览器不会基于页面的URL或与正在呈现的页面相关联的元数据进行缓存,甚至可能由于本地设置而导致缓存。 – Kieveli 2009-06-08 00:53:07

+0

一些(我不知道哪个)也不会缓存基于后缀的页面,即。他们不会缓存php页面,因为它们被称为动态内容。 – 2009-06-08 01:04:44

+0

非常有用的一点!我会记住任何未来与缓存相关的头部f *** s。 – joshcomley 2009-06-08 01:24:56

回答

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%依靠日期字符串来识别图像是否是新的(在我的特定场景中)。

0

你不会在你的文章中提到任何关于它的东西,但是这是一个https://地址吗?由于安全原因,浏览器不会从https站点缓存图像和页面。

0

需要在反应的产生担心的事情是:

  • ETag的
  • 过期

,你需要担心接收请求时存在的事物:

  • 的Last-Modified
  • 如果-比赛
  • 如果 - 无 - 匹配
  • 如果-Modified-Since的
  • 如果未修饰的,由于
  • 除非-Modified-Since的

您可能还需要担心下列HTTP方法:

  • GET
  • HEAD

这里,应该是比较容易重构适合您的旅行需求的解决方案: http://code.google.com/p/talifun-web/wiki/StaticFileHandler

它从文件系统读取文件,并把它们到内存高速缓存,所以只是改变从阅读数据库。应该是一件容易的工作。

相关问题