ASP.NET Web API中通过ETag实现缓存
通常情况下Server是无状态的,在ASP.NET Web API中,我们可以让服务端响应体中产生ETag属性,起到缓存的作用。大致实现原理是:
1、服务端的响应体中返回一个ETag属性
2、客户端通过If-None-Match属性把ETag的属性值传递给服务端
3、服务端返回304状态码
响应体中返回ETag属性
安装CacheCow.Server
在WebApiConfig.cs中配置:
using CacheCow.Server;
var cacheHandler = new CachingHandler();
config.MessageHandlers.Add(cacheHandler);
此时,在客户端发出请求:
User-Agent:Fiddler
Host:localhost:8901
在返回的消息中存在一个ETag属性。
ETag:W/"..."
通常情况下,服务器重启或IIS重启都会影响ETag的值。
此时,再把ETag放到请求体中:
User-Agent:Fiddler
Host:localhost:8901
If-None-Match:"..."
服务端返回304 Not Found.意味着自从Entity被创建后未曾被改变过。
响应体中返回ETag, LastModified属性
var cacheHandler = new CachingHandler();
cacheHandler.AddLastModifiedHeader = false;//默认为true
config.MessageHandlers.Add(cacheHandler);
此时,在客户端发出请求:
User-Agent:Fiddler
Host:localhost:8901
在返回的消息中存在一个ETag属性。
ETag:W/"..."
此时,再把ETag放到请求体中:
User-Agent:Fiddler
Host:localhost:8901
If-None-Match:"..."
服务端返回304 Not Found.并且有Last-Modified属性,表示上次修改的时间。
响应体中返回与Sql Server相关的ETag属性
安装CacheCow.Server.EntityTagStore.SqlServer
var connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
var etagStore = new SqlServerEntityTagStore(connString);
var cacheHandler = new CacheHandler(etagStore);
config.MessageHandlers.Add(cacheHandler);
还要在Sql Server上加一个存储过程。
→打开项目所在文件夹
→packages文件夹
→CacheCow.Server.EntityTagStore.SqlServer.0.4.1文件夹
→scripts下的script.sql文件,复制其中的语句,在Sql Server上创建对应的表和存储过程。
此时,在客户端发出请求:
User-Agent:Fiddler
Host:localhost:8901
在返回的消息中存在一个ETag属性。
ETag:"..."
但此时ETag的属性值没有以"W/"开头。
此时,再把ETag放到请求体中:
User-Agent:Fiddler
Host:localhost:8901
If-None-Match:"..."
服务端返回304 Not Found.意味着自从Entity被创建后未曾被改变过。