理解ASP.NET与客户端缓存之HTTP协议
序
本系列文章将讨论如何通过ASP.net服务器端技术优化客户端缓存策略,并使该策略可配置和可扩展。我们需要了解的是从HTTP协议中的相关属性对客户端缓存的影响,到ASP.NET如何控制这些属性来实现我们的缓存策略。
HTTP的基础知识
由于讨论涉及到客户端缓存,我们应该先简单介绍一下HTTP协议是如何控制客户端缓存的,这涉及到HTTP头的Last-Modified、ETag等属性。
最后修改的
当浏览器第一次请求一个URL时,服务器返回的状态会是200,内容就是你请求的资源。同时,有一个Last-Modified属性来标记这个文件在服务期结束时的最后修改时间。格式与此类似:
最后修改时间:Fri,2006年5月12日18:53:33 GMT
当客户端第二次请求该URL时,它会在标题中添加一个属性,询问文件在这次之后是否被修改过:
修改时间:Fri,2006年5月12日18时53分33秒GMT
如果服务器端的文件没有被修改,返回状态为304,内容为空,这样就节省了传输的数据量。如果服务器端的文件已被修改,则返回类似于第一个请求。
电子标签
类似于Last-Modified,由于RFC2616(也就是HTTP/1.1)并没有规定ETag应该是什么格式,只要确保用双引号括起来就可以了,这样就可以使用文件的hash,甚至可以直接使用Last-Modified。下面是服务器返回的格式:
ETag: "50b1c1d4f775c61:df3 "
客户端的查询更新格式如下:
if-None-Match:W/" 50 B1 C1 D4 f 775 c 61:df3 "
如果ETag没有改变,它将返回到状态304,然后不返回,这与Last-Modified相同。
期满
这个属性和使用HttpResponse一样直接。ASP中的ExpiresAbsolute,声明浏览器应该在特定时间到期后重新请求URL。格式是:
到期日:2002年2月10日星期日16:00:00 GMT
请注意HttpResponse。不建议在ASP.NET使用ExpiresAbsolute。现在我们应该使用HttpResponse.Cache.SetExpires。
杂注
我们通常使用的值是no-cache,这和在Cache-Control中使用no-cache值是一样的,下面会介绍。Pragma的使用格式如下:
Pragma:无缓存
缓存控制
这是一个聚合属性,可以包含许多子属性,并允许用户扩展新的子属性。的常见子属性包括:
Max-age-timeout以秒为单位,覆盖Expires属性。
public-允许保存在共享缓存中。
private-只允许保存在私有缓存中。
no-cache-不允许缓存。
不允许在持久媒体中进行无存储缓存。
no-transform-不允许更改存储系统。
0条评论