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

ASP.NET Web API中通过ETag实现缓存的更多相关文章

  1. ASP.NET Web API中的参数绑定总结

    ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...

  2. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  3. 在ASP.NET Web API中使用OData

    http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...

  4. ASP.NET Web API 中的异常处理(转载)

    转载地址:ASP.NET Web API 中的异常处理

  5. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  6. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  7. ASP.NET WEB API 中的路由调试与执行过程跟踪

    路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...

  8. 能省则省:在ASP.NET Web API中通过HTTP Headers返回数据

    对于一些返回数据非常简单的 Web API,比如我们今天遇到的“返回指定用户的未读站内短消息数”,返回数据就是一个数字,如果通过 http response body 返回数据,显得有些奢侈.何不直接 ...

  9. 【ASP.NET Web API教程】5.5 ASP.NET Web API中的HTTP Cookie

    原文:[ASP.NET Web API教程]5.5 ASP.NET Web API中的HTTP Cookie 5.5 HTTP Cookies in ASP.NET Web API 5.5 ASP.N ...

随机推荐

  1. 图解USB协议之一 枚举过程【转】

    转自:http://blog.csdn.net/myarrow/article/details/8270060 0. 枚举流程 • 连接了设备的 HUB 在 HOST 查询其状态改变端点 时返回对应的 ...

  2. 驱动程序vmci.sys版本不正确。请尝试重新安装 VMware

    今天在测试一台服务器,安装在虚拟机里面,但是发现在安装后,重启了一下电脑,出现了这个错误: 无法获取 vmci 驱动程序版本: 句柄无效.驱动程序 vmci.sys 版本不正确.请尝试重新安装 VMw ...

  3. Spring对象依赖关系处理

    Spring中给对象属性赋值 1.通过set方法给属性注入值 2.p名称空间 3.自动装配 4.注解 编写MVCModel调用userAction MVCModel public class MVCM ...

  4. Java编程的逻辑 (18) - 为什么说继承是把双刃剑

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  5. Build OpenJDK9 on macOS Sierra

    1. Get the source code: hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9 cd jdk9 sh get_source.sh ...

  6. hdu 5428 质因子

    问题描述有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个 ...

  7. 样式加载不出来,浏览器控制台报错:Resource interpreted as Stylesheet but transferred with MIME type text/html

    写登录的时候出现的问题,样式时好时坏,浏览器控制台看到的信息是: Uncaught SyntaxError: Unexpected token <Resource interpreted as ...

  8. codeforces_1092c

    title: codeforces_1092c date: 2018-12-24 19:42:23 tags: acm 刷题 概述 一道有关字符串前缀后缀的题,,,自己迟早要坑在这字符串的题上,,,一 ...

  9. Mysql Lock wait timeout exceeded; try restarting transaction的问题

    今天在后台跑任务的时候,发现了数据库报错1205 - Lock wait timeout exceeded; try restarting transaction.问题原因是因为表的事务锁,以下是解决 ...

  10. 5,EasyNetQ-Send Receive

    而发布/订阅和请求/响应模式是位置透明的,因为您不需要指定消息的消费者所在的位置,发送/接收模式专门用于通过命名队列进行通信. 它也不会对可以通过队列发送的消息的类型做任何假设. 这意味着您可以通过同 ...