日期:2014-05-17  浏览次数:20530 次

ashx输出图片,要求浏览器缓存
我用url重写 如
abc.jpg_60x60.jpg

则把abc.jpg 压缩称60像素 然后输出

context.Response.Clear();
context.Response.Expires = 60;
context.Response.ContentType = "image/*";
context.Response.BinaryWrite(bytes);
context.Response.CacheControl = "cache";

但浏览器对图片不会缓存,每次刷新总是重新请求,压缩~很纠结啊
怎么设置可以让浏览器缓存图片呢~不用每次都请求服务器

------解决方案--------------------
引用:
但浏览器对图片不会缓存,每次刷新总是重新请求,压缩~很纠结啊
怎么设置可以让浏览器缓存图片呢~不用每次都请求服务器

浏览器缓存并不是什么“不用每次都请求服务器”的概念。

实际上如果你输出内容时http消息中有 Last-Modified 头部参数,那么浏览器都会自动进行客户端缓存。然后当请求相同url的内容时浏览器就会自动发送 If-Modified-Since 消息头,告诉服务器程序此内容在客户端的版本。然后你的 ashx 检测到具有这个消息头,就可以返回 304 状态告诉浏览器“直接使用客户端缓存”。

这样,服务器就不会一遍遍下载图片了!

而 asp.net 并不支持这个机制,它会一遍遍下载图片。即使它支持服务器端缓存(设置context.Response.Cache就是服务器端缓存),也仍然是一遍遍下载图片,一点也没有节省网络带宽。

你需要自己在你的ashx中,输出图片时为消息头增加一个 Last-Modified 参数;并且在获得请求时先去检测一下是否有 If-Modified-Since 消息头,如果有的话就判断图片资源时间是否过期,没有过期直接将 context.Response.StatusCode 设置为304 而不需要下载 bytes 内容!