.net core api 请求实现接口幂等性
简单实现接口幂等性,根据参数的hascode实现:
- 参数介绍
- WaitMillisecond : 请求等待毫秒数
- CacheMillisecond:请求结果缓存毫秒数
- 参数具体使用场景
- WaitMillisecond :用户频繁发起多次请求,只处理第一次请求,后续请求在这个等待(时间范围内)的均返回“正在执行..”,超出这个预设时间会再次真实请求到后台业务逻辑
- CacheMillisecond:第一次请求成功并且拿到结果,用户频繁发起请求 在这个缓存时间在,将返回上次一样的结果。直至过期
1.使用方式
[HttpPost]
[HttpIdempotent(WaitMillisecond = 10000,CacheMillisecond = 3000)]
public async Task<IActionResult> Order(string orderNo)
{
//TODO
}
2.具体实现
1 /// <summary>
2 /// api request idempotence
3 /// </summary>
4 public class HttpIdempotentAttribute : Attribute, IAsyncResourceFilter
5 {
6
7 static HttpIdempotentAttribute()
8 {
9 var thread = new Thread(() =>
10 {
11 while (true)
12 {
13 var hashtableDatas = HashTable.Where(x => DateTime.Now > x.Value.Time).ToList();
14
15 if (hashtableDatas.Any())
16 {
17 foreach (var hashtableData in hashtableDatas)
18 {
19 HashTable.Remove(hashtableData.Key);
20 }
21 }
22 else
23 {
24 System.Threading.Thread.Sleep(2000);
25 }
26 }
27
28 });
29
30 thread.IsBackground = true;
31 thread.Start();
32 }
33
34 /// <summary>
35 /// http request parameter code collect
36 /// </summary>
37 private static readonly Dictionary<int, HashtableData> HashTable = new();
38
39 /// <summary>
40 /// http request parameter code
41 /// </summary>
42 public int _httpHasCode;
43
44 /// <summary>
45 /// waiting for the last request , default value:1000
46 /// </summary>
47 public double WaitMillisecond { get; set; } = 1000;
48
49 /// <summary>
50 /// result cache Millisecond , default value:1000
51 /// </summary>
52 public double CacheMillisecond { get; set; } = 1000;
53
54 /// <summary>
55 /// interceptor
56 /// </summary>
57 /// <param name="context"></param>
58 /// <param name="next"></param>
59 /// <returns></returns>
60 public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
61 {
62 await this.SetHttpParameterHasCode(context.HttpContext);
63
64 if (HashTable.ContainsKey(_httpHasCode))
65 {
66 var hashtableData = (HashtableData)HashTable[_httpHasCode];
67 if (hashtableData != null)
68 {
69 if (DateTime.Now < hashtableData.Time)
70 {
71 context.Result = hashtableData.Value;
72 return;
73 }
74 else if (DateTime.Now > hashtableData.Time)
75 {
76 HashTable.Remove(_httpHasCode);
77 }
78 else if (hashtableData.Value.Value == null)
79 {
80 context.Result = new ContentResult()
81 {
82 Content = "正在执行..."
83 };
84 return;
85 }
86 }
87 }
88
89 HashTable.Add(_httpHasCode, new HashtableData(DateTime.Now.AddMilliseconds(WaitMillisecond), null));
90
91 try
92 {
93 var netResult = await next();
94
95 if (HashTable.ContainsKey(_httpHasCode))
96 {
97 var hashtableData = (HashtableData)HashTable[_httpHasCode];
98 if (hashtableData != null)
99 {
100 hashtableData.Value = (ObjectResult)netResult.Result;
101 hashtableData.Time = DateTime.Now.AddMilliseconds(CacheMillisecond);
102 }
103 }
104 }
105 catch (Exception ex)
106 {
107 HashTable.Remove(_httpHasCode);
108 }
109
110 }
111
112 /// <summary>
113 /// get http request parameter code
114 /// </summary>
115 /// <returns></returns>
116 private async Task SetHttpParameterHasCode(HttpContext httpContext)
117 {
118
119 object readFromJson = null;
120
121 try
122 {
123 if (httpContext.Request.Method != "GET")
124 {
125 readFromJson = await httpContext.Request.ReadFromJsonAsync<object>();
126 }
127 }
128 catch (Exception e)
129 {
130 Console.WriteLine(e);
131 }
132
133 //todo 根据实际项目情况处理,获取Headers toke
134 var authorization = httpContext.Request.Headers["Authorization"];
135
136 var queryString = httpContext.Request.QueryString;
137 var bodyString = readFromJson == null ? string.Empty : readFromJson.ToString();
138
139 var builder = $"{authorization}-{queryString}-{bodyString}";
140
141 this._httpHasCode = builder.GetHashCode();
142 }
143
144 /// <summary>
145 /// Hashtable parameter model
146 /// </summary>
147 private class HashtableData
148 {
149 public HashtableData(DateTime time, ObjectResult value)
150 {
151 Time = time;
152 Value = value;
153 }
154 public DateTime Time { get; set; }
155 public ObjectResult Value { get; set; }
156 }
157 }
.net core api 请求实现接口幂等性的更多相关文章
- 防盗链&CSRF&API接口幂等性设计
防盗链技术 CSRF(模拟请求) 分析防止伪造Token请求攻击 互联网API接口幂等性设计 忘记密码漏洞分析 1.Http请求防盗链 什么是防盗链 比如A网站有一张图片,被B网站直接通过img标签属 ...
- Spring中统一相同版本的api请求路径的一些思考
Spring中统一相同版本的api请求路径的一些思考 问题场景 当我们在实际开发中,可能会遇到开发相同同版本的api, 假设相同版本的api请求路径为/v1/functionA,/v1/functio ...
- asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现
使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...
- API接口幂等性框架设计
表单重复提价问题 rpc远程调用时候 发生网络延迟 可能有重试机制 MQ消费者幂等(保证唯一)一样 解决方案: token 令牌 保证唯一的并且是临时的 过一段时间失效 分布式: redis+to ...
- 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- .NET CORE API 使用Postman中Post请求获取不到传参问题
开发中遇到个坑 记录下. 使用Postman请求core api 接口时,按之前的使用方法(form-data , x-www-form-urlencoded)怎么设置都无法访问. 最后采用raw写入 ...
- IdentityServer4实现.Net Core API接口权限认证(快速入门)
什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...
- 详解ASP.NET Core API 的Get和Post请求使用方式
上一篇文章帮助大家解决问题不彻底导致博友使用的时候还是遇到一些问题,欢迎一起讨论.所以下面重点详细讲解我们常用的Get和Post请求( 以.net core2.2的Http[Verb]为方向 ,推荐该 ...
随机推荐
- 如何借助 JuiceFS 为 AI 模型训练提速 7 倍
背景 海量且优质的数据集是一个好的 AI 模型的基石之一,如何存储.管理这些数据集,以及在模型训练时提升 I/O 效率一直都是 AI 平台工程师和算法科学家特别关注的事情.不论是单机训练还是分布式训练 ...
- .Net Core 实现 自定义Http的Range输出实现断点续传或者分段下载
一.Http的Range请求头,结合相应头Accept-Ranges.Content-Range 可以实现如下功能: 1.断点续传.用于下载文件被中断后,继续下载. 2.大文件指定区块下载,如视频.音 ...
- The art of multipropcessor programming 读书笔记-硬件基础1
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...
- VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别
程序运行时出现问题,选择的是Release,win64位的模式,并且已经看到了宏定义NDEBUG,但是程序依然进入上面的部分 解决方案是将属性->C/C++->代码生成器->运行库里 ...
- 一文学会Java事件机制
本文同时发布于个人网站 https://ifuyao.com/blog/java-event/ 相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控 ...
- 学习使用SignalR
1.创建空白的控制台程序 2.添加两个NuGet包(Microsoft.AspNet.SignalR.SelfHost.Microsoft.Owin.Cors.Topshelf)Topshelf用于快 ...
- 搭建Mac+Java+appium+IOS真机自动化环境
一.安装前环境准备 1.确保电脑已经有homebrew(包管理器) 下载链接[https://brew.sh/] 2.通过 brew 安装node.js brew install node 安装 ...
- 阿里云服务器上在docker部署jenkins
1.查询jenkins:docker search jenkins 2.拉取jenkins镜像 docker pull jenkins/jenkins:lts 3.新建jenkins的工作目录: mk ...
- C语言中while 语句
while的执行顺序 while 循环的执行顺序非常简单,它的格式是: while (表达式) { 语句: } 概念:当表达式为真,则执行下面的语句:语句执行完之后再判断表达式是否为真,如果为真,再次 ...
- 【数学】快速傅里叶变换(FFT)
快速傅里叶变换(FFT) FFT 是之前学的,现在过了比较久的时间,终于打算在回顾的时候系统地整理一篇笔记,有写错的部分请指出来啊 qwq. 卷积 卷积.旋积或褶积(英语:Convolution)是通 ...