2011-02-24 156 views
0

我有一个http处理程序从服务器上的文件系统检索图像。我需要在客户端(浏览器)缓存这些图像。对于那件事我做下面的代码客户端图像缓存

 context.Response.Clear() 
     context.Response.ClearHeaders() 
     context.Response.ClearContent() 
     Dim ImageCacheExpiry = ConfigurationManager.AppSettings("ImageCacheExpiryDuration") 
     context.Response.Cache.SetCacheability(HttpCacheability.Private) 
     context.Response.Cache.SetExpires(DateTime.Now.AddHours(ImageCacheExpiry)) 
     context.Response.Cache.VaryByParams(DisplayImage.FileName) = True 
     context.Response.Cache.SetLastModified(DisplayImage.DateModified) 
     context.Response.AddHeader("Content-Disposition", "inline; filename=" & DisplayImage.FileName) 
     context.Response.ContentType = DisplayImage.MimeType 
     context.Response.BinaryWrite(DisplayImage.ImageBytes) 
     context.Response.Flush() 
     context.Response.Close() 
     context.Response.End() 
    'DisplayImage is the object that is having all the data of images like 
    'DisplayImage.Filename, DisplayImage.FilePathandName, DisplayImage.MimeType etc 

这种情况发生的事情是...当我从它的缓存中把它的标签之间切换......但是当我击中了浏览器的刷新按钮,它的再次进入服务器上的文件系统......请告诉我如何在客户端缓存这些图像。

P.S:无法对我的应用程序中的所有页面进行标记缓存。

非常感谢提前....

+1

这就是缓存在浏览器中工作的方式。当您在浏览器中刷新页面时,浏览器将忽略任何缓存数据并从服务器获取新数据。 – 2011-02-24 20:09:31

+0

@Shiv库马尔 - 通常你必须按住CTRL键,然后按刷新浏览器忽略缓存。只需按刷新通常会导致外部文件来自缓存。 – 2011-02-24 21:39:12

+0

@DanTup,“通常”是这里的关键词。刷新对于不同的浏览器意味着许多不同的事情尽管如此,问题在于行为与预期相同,您无法控制每个浏览器的实现细节,您也不应该设计依赖于此类系统的系统。 – 2011-02-25 03:19:37

回答

0

根据浏览器和浏览器设置,您的浏览器可能会发送一个If-Modified-Since请求,看看缓存的数据是陈旧的。你应该使用类似Fiddler的东西来确定你的浏览器正在发送什么(和你的服务器返回)。您可能需要处理此问题,并返回一个304(未修改)标题。

+0

事情是,我能够缓存图像,并在缓存中获取它们,而我在应用程序中播放......正如我在小提琴手中看到的......但是当我点击浏览器的刷新按钮或F5键它去服务器获取图像...我研究了这一点,我知道刷新页面将定义去服务器获取数据....如果这是这种情况下,为什么我们做ctrl + F5删除缓存... – Sunny 2011-02-25 22:39:04

+0

感谢您的回复丹尼.. – Sunny 2011-02-25 22:39:32

+0

这可能是值得查找具体的浏览器,当你按下刷新。可能它总是进入e服务器,但发出If-Modified-Since请求,而Ctrl + Refresh可能会放弃缓存,并且*总是*获取新页面。处理If-Modified-Since如果您试图节省带宽/处理,则返回Not Modified标头可能是一个好主意。 – 2011-02-26 10:49:00