理解ASP.NET与客户端缓存之HTTP协议
2008-05-01 04:14
507 查看
前言
这个系列的文章要讨论的是如何通过HTTP://www.66of.com" target=_blank>ASP.HTTP://www.66of.com" target=_blank>NET服务器端技术来优化客户端缓存策略,而且让这种策略变得可配置和可扩展。我们要了解的知识从HTTP协议中相关属性对客户端缓存的影响,到HTTP://www.66of.com" target=_blank>ASP.HTTP://www.66of.com" target=_blank>NET如何控制这些属性来实现我们的缓存策略。
HTTP基础知识
由于讨论涉及到客户端缓存,所以还是先要简单介绍一下HTTP协议是如何控制客户端缓存的,这里涉及到HTTP头的Last-Modified、ETag等属性。
Last-Modified
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客户端第二次请求此URL时,会在头部加入一个属性,询问该时间之后文件是否有被修改过:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服务器端的文件没有被修改过,则返回状态是304,内容为空,这样就节省了传输数据量。如果服务器端的文件被修改过,则返回和第一次请求时类似。
ETag
和Last-Modified类似,由于RFC2616(也就是HTTP/1.1)中没有说明ETag该是什么格式的,只要确保用双引号括起来就行了,所以你可以用文件的hash,甚至是直接用Last-Modified,以下是服务器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客户端的查询更新格式是这样的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。
Expires
这个属性就如我们在HTTP://www.66of.com" target=_blank>ASP中使用HTTPResponse.ExpiresAbsolute一样直接,声明某某时刻过期之后浏览器就应该重新请求该URL,使用格式为:
Expires: Sun, 10 Feb 2002 16:00:00 GMT
注意HTTPResponse.ExpiresAbsolute在HTTP://www.66of.com" target=_blank>ASP.HTTP://www.66of.com" target=_blank>NET中是不建议使用的,现在我们应该使用的是HTTPResponse.Cache.SetExpires。
Pragma
通常我们用到的值就是no-cache,这和在Cache-Control中使用no-cache值是一样的,Cache-Control在下面讲。Pragma的使用格式如下:
Pragma: no-cache
Cache-Control
这是一个集合型属性,它里面能够包含很多子属性,并且允许用户扩展新的子属性。常见的子属性包括:
max-age - 以秒为单位的超时,覆盖Expires属性。
public - 允许保存在共享缓存中。
private - 只允许保存在私有缓存中。
no-cache - 不允许缓存。
no-store - 不允许缓存在持久介质中。
no-transform - 不允许转换存储系统。
这个系列的文章要讨论的是如何通过HTTP://www.66of.com" target=_blank>ASP.HTTP://www.66of.com" target=_blank>NET服务器端技术来优化客户端缓存策略,而且让这种策略变得可配置和可扩展。我们要了解的知识从HTTP协议中相关属性对客户端缓存的影响,到HTTP://www.66of.com" target=_blank>ASP.HTTP://www.66of.com" target=_blank>NET如何控制这些属性来实现我们的缓存策略。
HTTP基础知识
由于讨论涉及到客户端缓存,所以还是先要简单介绍一下HTTP协议是如何控制客户端缓存的,这里涉及到HTTP头的Last-Modified、ETag等属性。
Last-Modified
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客户端第二次请求此URL时,会在头部加入一个属性,询问该时间之后文件是否有被修改过:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服务器端的文件没有被修改过,则返回状态是304,内容为空,这样就节省了传输数据量。如果服务器端的文件被修改过,则返回和第一次请求时类似。
ETag
和Last-Modified类似,由于RFC2616(也就是HTTP/1.1)中没有说明ETag该是什么格式的,只要确保用双引号括起来就行了,所以你可以用文件的hash,甚至是直接用Last-Modified,以下是服务器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客户端的查询更新格式是这样的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。
Expires
这个属性就如我们在HTTP://www.66of.com" target=_blank>ASP中使用HTTPResponse.ExpiresAbsolute一样直接,声明某某时刻过期之后浏览器就应该重新请求该URL,使用格式为:
Expires: Sun, 10 Feb 2002 16:00:00 GMT
注意HTTPResponse.ExpiresAbsolute在HTTP://www.66of.com" target=_blank>ASP.HTTP://www.66of.com" target=_blank>NET中是不建议使用的,现在我们应该使用的是HTTPResponse.Cache.SetExpires。
Pragma
通常我们用到的值就是no-cache,这和在Cache-Control中使用no-cache值是一样的,Cache-Control在下面讲。Pragma的使用格式如下:
Pragma: no-cache
Cache-Control
这是一个集合型属性,它里面能够包含很多子属性,并且允许用户扩展新的子属性。常见的子属性包括:
max-age - 以秒为单位的超时,覆盖Expires属性。
public - 允许保存在共享缓存中。
private - 只允许保存在私有缓存中。
no-cache - 不允许缓存。
no-store - 不允许缓存在持久介质中。
no-transform - 不允许转换存储系统。
相关文章推荐
- ASP.NET与客户端缓存之HTTP协议的理解
- 深入理解 ASP.NET 与客户端缓存 (Part 1 - HTTP 协议)
- 深入理解 ASP.NET 与客户端缓存 (Part 1 - HTTP 协议)
- 理解ASP.NET与客户端缓存之HTTP协议
- 深入理解 ASP.NET 与客户端缓存 (Part 2 - ASP.NET 支持)
- asp.net 客户端浏览器缓存的Http头介绍
- 深入理解 ASP.NET 与客户端缓存 (Part 2 - ASP.NET 支持)
- 深入理解 ASP.NET 与客户端缓存 (Part 2 - ASP.NET 支持)
- asp.net 客户端浏览器缓存的Http头介绍
- ASP.NET 管道事件与HttpModule, HttpHandler简单理解 -摘自网络
- ASP.NET 管道事件与HttpModule, HttpHandler简单理解
- 深入理解asp.net里的HttpModule机制
- ASP.NET 缓存(七)--根据参数缓存页的版本http://www.opent.cn/?action=show&id=194
- 要理解__doPostback函数的用法,首先我们要理解Asp.net 中服务端控件事件是如何触发的。 Asp.net 中在客户端触发服务端事件分为三种情况: 一. WebControls中
- 在ASP.NET中清空浏览器客户端的缓存
- 深入理解asp.net里的HttpModule机制
- ASP.NET 客户端缓存
- 【翻译】使用ASP.NET序列化对象,基于http协议
- 在ASP.NET中清空浏览器客户端的缓存
- ASP.NET 管道事件与HttpModule, HttpHandler简单理解