让浏览器做缓存需要给浏览器发送指定的Http头
告诉浏览器缓存多长时间
或者坚决不要缓存
作的程序员
其实我们一直都在用这种方法
在OutputCache指令中指定缓存的Location为Client时
其实就是给浏览器发送了一个Http头
告诉浏览器这个Url要缓存多长时间
最后修改的时间
微软在OutputCacheModule中对这些缓存用到的Http头给我们进行了很好的封装但是了解这些Http头可以更灵活的使用它们
和客户端缓存相关的Http头有以下几个分别是
Expires:+过期时间
表示在指定时间后浏览器缓存失效需要注意的是这儿的过期时间必须是HTTP格式的日期时间其他的都会被解析成当前时间之前缓存会马上过期HTTP的日期时间必须是格林威治时间(GMT)而不是本地时间举例
复制代码 代码如下:
Expires: Fri Oct ::
使用Expires过期必须要求服务器的时间是正确的否则发送的http头就会出问题在windows服务下可以设置时间服务器来同步时间
Cachecontrol:
Cachecontrol直译成中文就是缓存控制它的作用就是缓存控制这个http头的值有几种
) maxage=[秒] — 执行缓存被认为是最新的最长时间类似于过期时间这个参数是基于请求时间的相对时间间隔而不是绝对过期时间[秒]是一个数字单位是秒从请求时间开始到过期时间之间的秒数
) smaxage=[秒] — 类似于maxage属性除了他应用于共享(如代理服务器)缓存
) public — 标记认证内容也可以被缓存一般来说 经过HTTP认证才能访问的内容输出是自动不可以缓存的
) nocache — 强制每次请求直接发送给源服务器而不经过本地缓存版本的校验这对于需要确认认证应用很有用(可以和public结合使用)或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处)
) nostore — 强制缓存在任何情况下都不要保留任何副本
) mustrevalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的HTTP允许缓存在某些特定情况下返回过期数据指定了这个属性你高速缓存你希望严格的遵循你的规则
) proxyrevalidate — 和 mustrevalidate类似除了他只对缓存代理服务器起作用
举例:
复制代码 代码如下:
CacheControl: maxage= mustrevalidate
很显然Cachecontrol可以提供比Expires更灵活的缓存控制而且它不需要依赖于服务器时间
在AspNet中微软把对Cachecontrol属性的设置封装到了HttpCachePolicy类中我们可以通过ResponseCache来调用以下方法来做到对CacheControl Http头值的控制
复制代码 代码如下:
ResponseCacheControl;
ResponseCacheSetNoStore
ResponseCacheSetMaxAge
ResponseCacheSetProxyMaxAge
ResponseCacheSetRevalidation
LastModified/IfModifiedSince
这两个Http头是一对前者表示某个地址的最近更新时间是服务器端响应给客户端的而后者是客户端浏览器发送给服务器的告诉web服务器客户端有一个最后更改时间为什么时间的缓存服务器端接收到IfModifiedSince头后则判断客户端缓存的这份url地址的缓存是否是最新的如果是最新的则服务器端直接给客户端返回HttpStatus 意思是说这个内容在你上次请求之后没有变化过你直接用缓存就可以了如果服务器发现url的最后更新时间比IfModifiedSince的值要新则会输出新的内容
同样微软也为我们做了服务器端设置的封装我们可以这样调用
复制代码 代码如下:
ResponseCacheSetLastModified(DateTime)
ResponseCacheSetLastModifiedFromFileDependencies()
如果有更复杂的需求就需要自己处理了
ETag/IfNoneMatch
ETag和LastModified类似不过他发送的是一个字符串来标示url的版本如果url变了则此标示也跟着变化在浏览器发送IfNoneMatch时告诉浏览器内容已经变了或者没变可以使用缓存
Iis会自动给静态文件加上Etag在文件发生改变时重新生成一个Etag这样对于一个网站中的n多个静态文件如样式表小图片等客户端只下载一次就够了可以减轻负载
在AspNet中我们可以用以下两个方法来设置
复制代码 代码如下:
ResponseCacheSetETag(string)
ResponseCacheSetETagFromFileDependencies()
尽管微软为我们做了很多封装但是我们还是需要详细的了解之后才可以用好这几个Http头