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被创建后未曾被改变过。
ASP.NET Web API中通过ETag实现缓存的更多相关文章
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- 在ASP.NET Web API中使用OData
http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...
- ASP.NET Web API 中的异常处理(转载)
转载地址:ASP.NET Web API 中的异常处理
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...
- 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 ...
- ASP.NET WEB API 中的路由调试与执行过程跟踪
路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...
- 能省则省:在ASP.NET Web API中通过HTTP Headers返回数据
对于一些返回数据非常简单的 Web API,比如我们今天遇到的“返回指定用户的未读站内短消息数”,返回数据就是一个数字,如果通过 http response body 返回数据,显得有些奢侈.何不直接 ...
- 【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 ...
随机推荐
- 图解USB协议之一 枚举过程【转】
转自:http://blog.csdn.net/myarrow/article/details/8270060 0. 枚举流程 • 连接了设备的 HUB 在 HOST 查询其状态改变端点 时返回对应的 ...
- 驱动程序vmci.sys版本不正确。请尝试重新安装 VMware
今天在测试一台服务器,安装在虚拟机里面,但是发现在安装后,重启了一下电脑,出现了这个错误: 无法获取 vmci 驱动程序版本: 句柄无效.驱动程序 vmci.sys 版本不正确.请尝试重新安装 VMw ...
- Spring对象依赖关系处理
Spring中给对象属性赋值 1.通过set方法给属性注入值 2.p名称空间 3.自动装配 4.注解 编写MVCModel调用userAction MVCModel public class MVCM ...
- Java编程的逻辑 (18) - 为什么说继承是把双刃剑
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 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 ...
- hdu 5428 质因子
问题描述有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个 ...
- 样式加载不出来,浏览器控制台报错:Resource interpreted as Stylesheet but transferred with MIME type text/html
写登录的时候出现的问题,样式时好时坏,浏览器控制台看到的信息是: Uncaught SyntaxError: Unexpected token <Resource interpreted as ...
- codeforces_1092c
title: codeforces_1092c date: 2018-12-24 19:42:23 tags: acm 刷题 概述 一道有关字符串前缀后缀的题,,,自己迟早要坑在这字符串的题上,,,一 ...
- Mysql Lock wait timeout exceeded; try restarting transaction的问题
今天在后台跑任务的时候,发现了数据库报错1205 - Lock wait timeout exceeded; try restarting transaction.问题原因是因为表的事务锁,以下是解决 ...
- 5,EasyNetQ-Send Receive
而发布/订阅和请求/响应模式是位置透明的,因为您不需要指定消息的消费者所在的位置,发送/接收模式专门用于通过命名队列进行通信. 它也不会对可以通过队列发送的消息的类型做任何假设. 这意味着您可以通过同 ...