我有一个自定义处理程序将图像返回给浏览器。为什么我的自定义交付图像缓存在浏览器中?
图像是从数据库中提取的。
出于某种原因,图像不被浏览器缓存,和我想知道是否有人也许能发现什么,我从下面的代码所缺少:
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检查乐趣,最终修复了它。我在下面发布我的解决方案
您应该发布更多信息。有时,浏览器不会基于页面的URL或与正在呈现的页面相关联的元数据进行缓存,甚至可能由于本地设置而导致缓存。 – Kieveli 2009-06-08 00:53:07
一些(我不知道哪个)也不会缓存基于后缀的页面,即。他们不会缓存php页面,因为它们被称为动态内容。 – 2009-06-08 01:04:44
非常有用的一点!我会记住任何未来与缓存相关的头部f *** s。 – joshcomley 2009-06-08 01:24:56