通常情况下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被创建后未曾被改变过。

最新文章

  1. SpringJDBC解析3-回调函数(update为例)
  2. jquery 插件之 点赞“+1” 特效
  3. 反射中 GetCustomAttributes
  4. 使用servlet实现文件上传
  5. NOT EXISTS优化
  6. windows7任务栏上的图标修复
  7. MongoDB学习笔记06
  8. bzoj1298题解
  9. crontab表达式执行时间计算,crontab在线测试
  10. 转-Windows路由表配置:双网卡路由分流
  11. Django里使用open函数
  12. Android性能优化之界面UI篇
  13. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
  14. 课程作业——Python基础之使用turtle库画出红旗
  15. 【转】vue父子组件之间的通信
  16. Spring Web项目spring配置文件随服务器启动时自动加载
  17. python requests上传文件 tornado 接收文件
  18. greenplum不能下载问题解决方法(转)
  19. linux内核中宏likely和unlikely到底做了些什么?
  20. thinkphp5的生命周期

热门文章

  1. poj2054
  2. Android工程方法数超过65535的解决办法
  3. shell升级
  4. jQuery.lazyload详解(转)
  5. SqlServer自定义函数Function中调用with as
  6. Web Automation with Selenium (C#)
  7. 一步一步学习IdentityServer3 (1)
  8. 记录一起k8s的service服务名解析灵异事件
  9. 二维码生成delphi版
  10. vue-element-table-js去重合并单元格解析【实战需求】