一键搞定ASP.NET Core Web API幂等性

API的幂等性(Idempotent),是指调用某个方法1次或N次对资源产生的影响结果都是相同的。

GET请求默认是幂等的,因为它只是查询资源,而不会修改资源。

而POST请求默认是不幂等的,多次调用POST方法可能会产生不同的结果,并会创建多个资源。

想象一下,你在扫码支付时,输入金额后点击了2次“确定”按钮,肯定不希望扣2次款。

幂等性保证了操作只会执行一次。

1.思路

使用ASP.NET Core过滤器来处理POST请求,检查请求头中的幂等键(IdempotencyKey)

如果在缓存中未检查到IdempotencyKey,则真实执行操作并缓存响应数据,否则直接返回缓存的响应数据。

这样,操作只能对资源产生一次影响。

原理示意图如下:

2.实现

2.1 IdempotentAttributeFilter

创建自定义Filter。

使用OnActionExecuting方法在执行操作前检查缓存,如有缓存直接返回context.Result;使用OnResultExecuted方法在执行操作后缓存响应。

代码如下:

public class IdempotentAttributeFilter : IActionFilter, IResultFilter
{private readonly IDistributedCache _distributedCache;private bool _isIdempotencyCache= false;const string IdempotencyKeyHeaderName = "IdempotencyKey";private string _idempotencyKey;public IdempotentAttributeFilter(IDistributedCache distributedCache){_distributedCache = distributedCache;}public void OnActionExecuting(ActionExecutingContext context){Microsoft.Extensions.Primitives.StringValues idempotencyKeys;context.HttpContext.Request.Headers.TryGetValue(IdempotencyKeyHeaderName, out idempotencyKeys);_idempotencyKey = idempotencyKeys.ToString();var cacheData = _distributedCache.GetString(GetDistributedCacheKey());if (cacheData != null){context.Result = JsonConvert.DeserializeObject<ObjectResult>(cacheData);_isIdempotencyCache = true;return;}}public void OnResultExecuted(ResultExecutedContext context){//已缓存if (_isIdempotencyCache){return;}var contextResult = context.Result;DistributedCacheEntryOptions cacheOptions = new DistributedCacheEntryOptions();cacheOptions.AbsoluteExpirationRelativeToNow = new TimeSpan(24, 0, 0);//缓存:_distributedCache.SetString(GetDistributedCacheKey(), JsonConvert.SerializeObject(contextResult), cacheOptions);}public void OnActionExecuted(ActionExecutedContext context){}public void OnResultExecuting(ResultExecutingContext context){}private string GetDistributedCacheKey(){return "Idempotency:" + _idempotencyKey;}
}

2.2 IdempotentAttribute

创建自定义Attribute。

声明了IdempotentAttribute的Class或者Method,在运行时会创建IdempotentAttributeFilter

代码如下:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class IdempotentAttribute : Attribute, IFilterFactory
{public bool IsReusable => false;public IFilterMetadata CreateInstance(IServiceProvider serviceProvider){var distributedCache = (IDistributedCache)serviceProvider.GetService(typeof(IDistributedCache));var filter = new IdempotentAttributeFilter(distributedCache);return filter;}
}

3.使用

3.1 创建项目

新建ASP.NET Core Web API项目,实现代码如下:

private static List<WeatherForecast> _db = new List<WeatherForecast>();[HttpPost]
public WeatherForecast Post(int temperature)
{var data = new WeatherForecast { TemperatureC = temperature };_db.Add(data);return data;
}[HttpGet]
public IEnumerable<WeatherForecast> Get()
{return _db.Select(p => new WeatherForecast{TemperatureC = p.TemperatureC,Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();
}

这里用一个静态变量模拟数据库,POST请求写入数据,GET请求读取数据。

3.2 设置幂等

为Post方法加上Idempotent Attribute:

[Idempotent]
public WeatherForecast Post(int temperature)

3.3 注册分布式缓存

从上面的原理图我们可以看到,必须增加分布式缓存,用于保存幂等键的值和响应数据。

修改Startup.cs:

public void ConfigureServices(IServiceCollection services)
{...services.AddDistributedMemoryCache();
}

3.4 测试

运行Web API,使用不同IdempotencyKey执行POST请求,然后获取数据:

可以看到,同一IdempotencyKey执行了2次,但是只写入了一条数据,成功!

结论

为了确保关键Web API的高可用性和业务连续性,实现幂等性是重要的一步。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我

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

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

相关文章

你这么爱听歌,一定活得很难过吧 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅让笑声飞沙雕营长大象ROV全球第一最搞搞笑热门神吐槽朱莉生活日记

Web开发中的矢量绘图(vml,svg)处理和应用

为什么80%的码农都做不了架构师&#xff1f;>>> 前言 1991 年物理学家 Tim Berners-Lee 首次在因特网上发布了 HTML 的第一版描述规范文档。经过了 20 多年的发展&#xff0c;HTML 语言成为如今编程最为广泛的语言和互联网上采用最广的文档格式。虽然 HTML 发展十分…

C#新手该如何规划学习【学习路线指南】

花费了几天时间整理了C#学习路线图&#xff0c;可以说是纯野生C#程序员成长路线规划&#xff0c;在这里分享下&#xff0c;希望可以帮助到想从事C#开发的同学们。本人阅历尚浅&#xff0c;有些知识点可能分享不正确&#xff0c;希望广大网友评论区补充&#xff0c;我会同步修正…

丰巢刷脸取件被小学生破解,号称3D、深度学习加持的人脸识别究竟靠谱吗?...

全世界只有3.14 % 的人关注了青少年数学之旅经费不够&#xff0c;2D来凑&#xff1f;前些天&#xff0c;丰巢智能快递柜被“小学生”用打印照片破解&#xff0c;让人大跌眼镜。据《人民日报》报道&#xff0c;嘉兴上外秀洲外国语学校402班科学小队向都市快报《好奇实验室》报料…

伍迷随想冷饭集 之 瞻前顾后之随想

哈哈&#xff0c;很是开心&#xff0c;今天是我的生日&#xff0c;由于各地对年龄的计算方法不同&#xff0c;你认为我是25周岁、26岁、还是27虚岁都行&#xff0c;反正是又老一年了。几乎在每年的这个时候&#xff0c;我都会对自己做一个小小的总结&#xff0c;不过以前都没有…

boost pool内存池库使用简要介绍

2019独角兽企业重金招聘Python工程师标准>>> 我厂内存次神马的一般都自己实现。我曾经也自己写过一个demo(mempool)。后来发现boost库里面有一个内存池库boost pool&#xff0c;貌似很好用&#xff0c;使用挺好&#xff0c;例子可以贴出来。 boost一共有4种内存池&…

嫁给我好吗?| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅

.NET Core etcd 配置源

etcd 是一个高可用的 Key/Value 存储系统&#xff0c;主要用于共享配置和服务发现&#xff0c;和目前比较主流的配置中心&#xff08;如&#xff1a;Spring Cloud Config、Apollo、Consul、Nacos&#xff09;、注册中心&#xff08;如&#xff1a;Zookeeper、Eureka、Consul、N…

继相对论、量子论之后,它的出现,给牛顿又来了致命一刀

全世界只有3.14 % 的人关注了青少年数学之旅前两天&#xff0c;有模友留言。今天&#xff0c;它来了。“微小的变化能带动整个系统的长期的巨大的连锁反应。”——节选自其实“混沌”一词&#xff0c;最早指的是宇宙未形成之前的混乱状态。/此混沌非彼馄饨/在希腊神话中&#x…

django基础1--django安装与helloworld测试

第一步测试服务器是否安装python直接输入python命令即可&#xff0c;ctrld退出第二步上传django安装包&#xff0c;解压进入后python setup.py install 安装第三步Python导入django看看是否生效先python进入python环境&#xff0c;然后import django命令查看是否正常执行第四步…

这就是你在妈妈肚子里尿尿的样子 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅其实“站着说话不腰疼”是有科学依据的不同姿势下腰椎承受的压力是这样的三思逍遥这是你在妈妈肚子里尿尿的样子不少人觉得葡萄上白色的这一层粉是“脏”的表现其实它是葡萄的“果粉”不仅对人体无害还可以代表这个葡萄很新鲜现实告诉…

c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法

usingSystem;usingSystem.IO;usingSystem.Data;usingSystem.Text;usingSystem.Diagnostics;usingSystem.Security;usingSystem.Security.Cryptography;/**//* * .Net框架由于拥有CLR提供的丰富库支持&#xff0c;只需很少的代码即可实现先前使用C等旧式语言很难实现的加密算法…

C# WPF MVVM项目实战(进阶①)

这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发&#xff0c;今天主要是增加了一个用户窗体TestFormView&#xff0c;然后通过TabControl&#xff0c;将新增的窗体加载到主界面上进行分页显示&#xff0c;新增的页面引用了WPF UI&#xff1a;WPF Datagrid合并表…

双十一变身大型奥数竞赛现场?数学不好的你请转场

当微信又被淘宝“助力”刷屏&#xff0c;我们开始意识到它来了&#xff0c;它真的来了它今天真的来了&#xff01;令人闻风丧胆的双十一又双叒叕要到了&#xff01;从最开始的光棍节变成现在的购物节每年双十一的优惠难度堪比南孚电池一节更比一节强小木&#xff1a;阿里&#…

css两栏式布局示例

请先看图,这里主要用到了float属性,该属性的值指出了对象是否及如何浮动 语法&#xff1a; float : none | left |right 参数&#xff1a; none :  对象不浮动;left :  对象浮在左边;right :  对象浮在右边 请看代码,请CSS高手指教,其他还可以用position来实现两栏,只…

HttpClient 禁用自动重定向

HttpClient 禁用自动重定向Intro前段时间写了一个小工具来帮助我们简化一个每个月一次的小任务&#xff0c;每个月我们公司的 BI Team 会给我们上个月访问量比较高的博客文章的 url&#xff0c;然后我们会根据 BI 提供博客的 url 去找到对应的博客 id&#xff0c;然后更新到配置…

OpenAI“单手解魔方”被公开质疑,Gary Marcus称七大问题涉嫌误导

全世界只有3.14 % 的人关注了青少年数学之旅近日&#xff0c;“OpenAI的机器手在4分钟内单手成功还原魔方”引起刷屏&#xff0c;然而&#xff0c;这一成就被著名机器学习怀疑论者马库斯质疑了&#xff0c;马库斯逐条列举OpenAI的误导性说法&#xff0c;机器学习圈却都撑OpenAI…

记一次 .NET 某云采购平台API 挂死分析

一&#xff1a;背景 1. 讲故事大概有两个月没写博客了&#xff0c;关注我的朋友应该知道我最近都把精力花在了星球&#xff0c;这两个月时间也陆陆续续的有朋友求助如何分析dump&#xff0c;有些朋友太客气了&#xff0c;给了大大的红包&#xff0c;哈哈????&#xff0c;手…

来自女朋友的灵魂拷问!| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅【1】【2】【3】【4】【5】【6】【7】【8】【9】

利用 PGO 提升 .NET 程序性能

引子.NET 6 开始初步引入 PGO。PGO 即 Profile Guided Optimization&#xff0c;通过收集运行时信息来指导 JIT 如何优化代码&#xff0c;相比以前没有 PGO 时可以做更多以前难以完成的优化。下面我们用 .NET 6 的 nightly build 版本 6.0.100-rc.1.21377.6 来试试新的 PGO。PG…