使用ETag协议实现ASP.NET Core API缓存

通常,我们在ASP.NET Core API服务端实现缓存,数据直接从缓存中取出,返回给客户端,以便加快响应速度。

但是这样的做法,解决不了数据传输到客户端需要占用带宽带来的性能问题。

这时,可以尝试使用ETag。

ETag协议

ETag是一个字符串;它表示客户端拥有的数据的某个“版本”。

客户端需要在请求头If-None-Match中传入ETag值,服务端检查到此特定请求头,会将此值与从服务端当前的ETag值相匹配。

如果匹配,服务端将只返回状态码304 Not Modified,表示客户端拥有的资源已经是最新的“版本”。否则,服务端将返回状态码200 OK和响应数据以及一个新的ETag。

客户端需要记录这个ETag值和缓存到期时间,缓存到期前可以不用访问服务端,节省服务端和客户端之间的带宽,并帮助客户端更快地执行操作,提高用户体验。

详细说明可以参看:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/ETag

实现

为了实现ETag功能,我们定义一个ActionFilter来生成ETag并将其附加到响应头。

ETagFilterAttribute实现代码如下:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class ETagFilterAttribute : ActionFilterAttribute
{private readonly int expireMinutes;public ETagFilterAttribute(): this(60){}public ETagFilterAttribute(int expireMinutes){this.expireMinutes = expireMinutes;}public override void OnActionExecuted(ActionExecutedContext context){var request = context.HttpContext.Request;var response = context.HttpContext.Response;if (request.Method == HttpMethod.Get.Method &&response.StatusCode == (int)HttpStatusCode.OK){var res = JsonConvert.SerializeObject(context.Result);// 使用响应内容的MD5哈希作为ETag值var etag = MD5Hash(res);if (request.Headers.Keys.Contains(HeaderNames.IfNoneMatch)){var requestEtag = request.Headers[HeaderNames.IfNoneMatch].ToString();if (requestEtag.Equals(etag)){context.Result = new StatusCodeResult((int)HttpStatusCode.NotModified);}}response.Headers.Add(HeaderNames.ETag, new[] { etag });response.Headers.Add(HeaderNames.Expires, new[] { DateTime.Now.AddMinutes(expireMinutes).ToString() });}base.OnActionExecuted(context);}public static string MD5Hash(string input){using (var md5 = MD5.Create()){var result = md5.ComputeHash(Encoding.UTF8.GetBytes(input));var strResult = BitConverter.ToString(result);return strResult.Replace("-", "");}}
}

仅当GET请求执行成功时,计算响应数据的MD5作为ETag,Etag默认过期时间是60分钟。

测试

服务端实现如下API,测试ETag机制:

[HttpGet]
[ETagFilter(1)]
public string Get()
{return DateTime.Now.Minute.ToString();
}

第一次不带ETag请求头发送请求,返回数据

1分钟内,带ETag请求头发送请求,服务端的ETag还未变化,不返回数据

1分钟后,带ETag请求头发送请求,服务端的ETag已经变化,返回新数据

结论

在本文中,我们实现了一个简单的ETag机制。

但是,有一点需要注意的是,要使ETag能够正常工作,需要客户端配合实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度优化sql 查询, 提升性能一百倍是什么概念?

正在做一个软件设计, 希望有个功能, 然而, 对于加上该功能后对系统性能造成的影响很是担忧. 可以说是, 一方面想要有这个功能, 另一方面又对性能问题是否能够解决很怀疑, 正处于犹豫不决状态. 于是决定进行实验. 首先对表结构和索引进行了优化, 初步结果还不错, 性能基本进入可…

女老师vs男老师的区别...

1 被帅到了2 失传已久的如来神掌??!!3 哎呦,谁拉我一把?4 决定到底要不要开始学习的我…5 女老师vs男老师监考的区别...6 函数广播体操7 这个打包装置够便捷,够酷炫!关键是省事你点的…

Redis Windows环境安装

1、下载Windows 版本 Redis: https://github.com/ServiceStack/redis-windows 2、 解压文件: F:\开源代码学习\01_Redis 打开 目录:F:\开源代码学习\01_Redis\src\msopentech\redis64-2.6.12.1 3、启动Redis 指向CMD命令: 4、测试安装成果&am…

Hello Blazor:(11)全局截获事件执行

前言在Blazor中&#xff0c;我们使用on{DOM EVENT}"{DELEGATE}"这样的Razor语法在组件标记中指定委托事件处理程序&#xff1a;<button onclick"IncrementCount">Click me</button>但是没有提供解除委托的方法。比如&#xff0c;我们需要在某种…

深度学习会不会被取代?深度学习必看发展史

近年来&#xff0c;随着人工智能时代的来临&#xff0c;数据科学、计算机科学迎来飞速发展&#xff0c;多次引发讨论的人机对战也正是人工智能与人类的对决。从无人驾驶汽车到AlphaGo战胜人类&#xff0c;机器学习成为了当下最热门的技术。而机器学习中一种重要的方法就是深度学…

Xcode6中如何对scrollview进行自动布局(autolayout)

本文转载至 http://www.cocoachina.com/ios/20141011/9871.html XCodeAutolayoutscrollView Xcode6中极大的增强了IB中自动布局的能力&#xff0c;下面就通过对刺儿头scrollview进行一次自动布局实战&#xff0c;看看自动布局在Xcode6中到底值不值得使用。 说 UIScrollView是个…

linux文件读保护,Linux Rootkit实现文件保护

一个非常基础的rootkit&#xff0c;禁止读取指定文件编译系统:CentOS 7uname -r3.10.0-957.21.3-el7.x86_64#include #include #include asmlinkage long(*real_open)(const char __user *filename, int flags, unsigned short mode);unsigned long **syscall_table NULL;char…

python的网页解析器_python 之网页解析器

一、什么是网页解析器 1、网页解析器名词解释 首先让我们来了解下&#xff0c;什么是网页解析器&#xff0c;简单的说就是用来解析html网页的工具&#xff0c;准确的说&#xff1a;它是一个HTML网页信息提取工具&#xff0c;就是从html网页中解析提取出“我们需要的有价值的数据…

写一个聊天辅助程序

Codeprocedure TForm1.Button1Click(Sender: TObject);varhParent,hButton,hMemo: HWND;beginMemo1.SelectAll;//Memo内容全选Memo1.CopyToClipboard;//把Memo中选中的语句拷贝到剪贴板中try//找发送消息的QQ窗口hParent : FindWindow(nil, 发送消息);//然后找回话时用的编辑窗…

真是个狠人!开学第一天,这批小学生的造型刷爆朋友圈!

全世界只有3.14 % 的人关注了爆炸吧知识在史上最长的长假过后杭州一二三年级小学生回到学校忘记座位在哪里、老师姓什么各种有趣故事不断……而在养正小学门口&#xff0c;从入校门开始&#xff0c;大家笑声就不断&#xff0c;别样的开学礼一下刷屏了朋友圈&#xff1a;每个小朋…

C++中如何读取一个数的位数_C语言编写程序求水仙花数

C语言编写程序求水仙花数水仙花数是一个数学问题&#xff0c;其实质是一个三位数&#xff0c;个位数的立方加十位数的立方加百位数的立方之和等于这个三位数本身。例如153&#xff1d;1*1*15*5*53*3*3&#xff0c;即153&#xff1d;112527。这是一个相对较为简单的C程序&#x…

RabbitMQ简介和六种工作模式详解

一、RabbitMQ简介是一个开源的消息代理和队列服务器&#xff0c;用来通过普通协议在完全不同的应用之间共享数据&#xff0c;RabbitMQ是使用Erlang(高并发语言)语言来编写的&#xff0c;并且RabbitMQ是基于AMQP协议的。1.1 AMQP协议Advanced Message Queuing Protocol(高级消息…

为什么男性比女性死得更早,心疼一秒钟!

最近娱乐圈的那些大瓜大家都吃了吗&#xff1f;某明星的运动&#xff1f;黑眼圈&#xff1f;&#xff1f;不免让小编想起之前看的文章 男性为啥比女性“去”的早嗯&#xff0c;有可能是操劳过度 生活太累 咳咳咳咳咳以上均是不负责任猜想吃瓜要谨慎呦????不过这篇报道…

(转)C#网络编程(基本概念和操作) - Part.1

源码下载&#xff1a;http://www.tracefact.net/SourceCode/Network-Part1-2.rar C#网络编程(基本概念和操作) - Part.1 引言 C#网络编程系列文章计划简单地讲述网络编程方面的基础知识&#xff0c;由于本人在这方面功力有限&#xff0c;所以只能提供一些初步的入门知识&#x…

jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?

什么是JSON Web Token &#xff1f;官网介绍&#xff1a;JSON Web Token(JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的&#xff0c;因此可以被验证和信任。可…

8月日更,我的困难与感悟

8月份参加了掘金的日更活动&#xff0c;坚持每天写技术文章进行分享&#xff0c;现在活动结束了&#xff0c;来复盘下这一个月来我的困难与感悟。8月日更其实刚开始我是不想参加这个活动的&#xff0c;最近确实比较忙&#xff0c;不管是工作还是自己的私事&#xff0c;都不允许…

那些神一样的学习技巧,专治各种不服!

▲ 点击查看著名的俄国生理学家曾反复对自己的学生提过这个要求&#xff1a;“应当先学会观察&#xff0c;观察。不学会观察&#xff0c;你就永远当不了科学家。”鲁迅也曾这样教导&#xff1a;“如果要创作&#xff0c;第一要观察。”在《神探夏洛克》中&#xff0c;有这么一段…

kafka 怎么样连接图形化界面_图形化编程有多简单,点亮LED不到一分钟

Arduino编程在所有单片机当中应该说是最简单的了&#xff0c;但是还可以更加简单。比如说图形化编程&#xff0c;图形化编程真正让Arduino大众化了&#xff0c;因为谁都可以通过图形化编程方式来制作自己需要的小玩意。啃萝卜关于图形化编程软件有很多&#xff0c;我独宠啃萝卜…

linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...

linux设备驱动归纳总结(一)&#xff1a;内核的相关基础概念1. 内核与 linux 设备驱动的作用与关系内核&#xff1a;用于管理软硬件资源&#xff0c;并提供运行环境。如分配 4G 虚拟空间等。linux 设备驱动&#xff1a;是连接硬件和内核之间的桥梁。linux 系统按个人理解可按下划…

怪不得超市不让带宠物...

1 难怪超市不让带狗啊▼2 医学生的聊天记录过于硬核▼3 你身边的外卖小哥头盔上都顶着什么呢&#xff1f;▼4 表妹非要把猫脸P到蜜蜂身上▼5 其实主要还是看脸脸到位了&#xff0c;祖安小公举问题都不大▼6 就你们这个送别方式我觉得他是回不来了......▼7 妹妹沦为工具…