首页 > 编程语言 >【转】[C#] WebAPI 防止并发调用二(冥等性)

【转】[C#] WebAPI 防止并发调用二(冥等性)

时间:2024-05-09 10:47:19浏览次数:14  
标签:WebAPI 请求 C# requestId 冥等性 using recentRequests ID

来自:阿里的 通义灵码

使用幂等性设计来防止C# WebAPI方法的并发调用是一种推荐的方法,因为它不会阻塞其他请求,而是确保多次调用同一个操作会产生相同的结果。这里有一个简单的示例,说明如何在WebAPI控制器中实现幂等性的API:

using System;
using System.Web.Http;
using System.Linq;
using System.Collections.Generic;

public class MyApiController : ApiController
{
    private readonly Dictionary<string, DateTime> _recentRequests = new Dictionary<string, DateTime>();

    [HttpPost]
    public IHttpActionResult ProcessOrder([FromBody] OrderRequest request)
    {
        string requestId = request.Id; // 假设每个请求都有一个唯一的ID

        // 检查在过去的一段时间内(例如1分钟)是否有相同的请求
        if (_recentRequests.ContainsKey(requestId) && (DateTime.UtcNow - _recentRequests[requestId]) < TimeSpan.FromMinutes(1))
        {
            return Conflict(); // 返回409 Conflict状态码,表示请求已经在处理中
        }

        // 存储请求ID,表示正在处理
        _recentRequests[requestId] = DateTime.UtcNow;

        try
        {
            // 这里执行你的关键操作,比如处理订单
            // ...

            // 假设订单处理成功
            return Ok("Order processed successfully.");
        }
        finally
        {
            // 清除过期的请求记录,保持字典大小
            var expiredRequests = _recentRequests.Where(r => (DateTime.UtcNow - r.Value) > TimeSpan.FromMinutes(1)).Select(r => r.Key).ToList();
            foreach (var expiredRequestId in expiredRequests)
            {
                _recentRequests.Remove(expiredRequestId);
            }
        }
    }

    public class OrderRequest
    {
        public string Id { get; set; } // 请求的唯一标识
        // 其他订单相关属性...
    }
}

在这个示例中,我们维护了一个字典 _recentRequests 来存储最近的请求ID及其时间戳。当新的请求到来时,我们检查这个ID是否在最近的一分钟内出现过。如果出现过,我们返回一个冲突状态,表明请求已经在处理中。如果没有,我们就记录这次请求并执行操作。最后,我们定期清理过期的请求记录,以防止字典过大。

请注意,这个示例假设了你有一个可以关联到每个请求的唯一ID。在实际应用中,你可能需要依赖数据库或其他持久化存储来实现幂等性,特别是当处理涉及数据库操作的情况时,你可能需要在数据库级别实现幂等性,例如通过使用唯一约束、事务和回滚逻辑等。

标签:WebAPI,请求,C#,requestId,冥等性,using,recentRequests,ID
From: https://www.cnblogs.com/z5337/p/18181591

相关文章

  • Cmake打印信息
    messageLogamessage.SynopsisGeneralmessagesmessage([<mode>]"messagetext"...)Reportingchecksmessage(<checkState>"messagetext"...)Generalmessagesmessage([<mode>]"messagetext"...)......
  • 安防监控/视频汇聚系统EasyCVR视频融合云平台+AI智能分析助力解决校园霸凌事件
    一、方案背景校园霸凌这一校园中不应存在的现象,却屡见不鲜,它像一把锋利的刀,深深地刺入那些无辜的心灵,让受害者承受着无尽的痛苦。随着科技的进步与发展,我们应该追求有效、进步的手段来阻止校园霸凌事件的发生,弥补当前校园安防监控工作的不足之处。在实际应用中,无须借助人力干预......
  • AI赋能EasyCVR视频汇聚/视频监控平台加快医院安防体系数字化转型升级
    背景近来,云南镇雄一医院发生持刀伤人事件持续发酵,目前已造成2人死亡21人受伤。此类事件在医院层出不穷,有的是因为医患纠纷、有的是因为打架斗殴。而且在每日大量流动的人口中,一些不法分子也将罪恶的手伸到了医院,实行扒、窃、抢、破坏等卑劣手段扰乱医院工作秩序,窃取他人钱财,破坏......
  • CF55D Beautiful numbers
    题目链接:https://www.luogu.com.cn/problem/CF55D数位dp解法:所有非零位都能整除这个数,那么就是说这些非零位的公倍数能够整除这个数。那么按照通常情况我们定义dp数组的时候应该定义成dp[pos][num][gbs],表示当前枚举到了第几位、上次枚举到的数、之前所有数位的最小公倍数。那......
  • windows下源码编译CMake项目
    Cmake项目1、安装路径和源码安装包下载地址:https://cmake.org/download/源码地址https://github.com/Kitware/CMake2、编译源码下载后会有一个CMake-master的文件夹在里面新建一个build目录打开cmake-gui可执行文件出现cmake的界面,设置source路径为刚刚的CMake-......
  • 【转】[C#] WebAPI 防止并发调用一(锁)
    来源:阿里的通义灵码在C#WebAPI中,如果你想要使用锁来防止并发调用,你可以使用System.Threading.Mutex或System.Threading.Lock来实现。但是,这种方法通常不推荐,因为它可能会导致请求阻塞,从而影响整个Web服务的性能。在Web环境中,更好的做法是使用幂等性设计或数据库事务来处理并发......
  • [转]vscode必备插件,美化、炫酷、实用-留着防丢
    vscode必备插件,美化、炫酷、实用-留着防丢-知乎(zhihu.com)https://zhuanlan.zhihu.com/p/112016680本篇文章只推荐看起来不错的插件,并不详细介绍插件的使用方法,插件的具体使用方法可以单独对其进行百度搜索。当然,有啥问题也可以在下面评论,但我觉得可以百度的地方,尽量还是手......
  • vscode快速生成文件/方法的插件
    需求背景编写完成一个代码源文件,他人想查看这个文件是谁编写的?、什么时候创建的?、最后一个编辑时间?等。如果文件所有者不写的话,你无法知道这些信息。我想在文件快速添加自定义头部信息以及函数注释信息,提供给自己和他人查询方便。当然我们可以一个一个字符敲上去,但是这种效率不......
  • java 多线程CountDownLatch
     CountDownLatch简介CountDownLatch 是Java中的一个同步工具类,可以用来确保一组线程等待其他线程完成各自工作后再继续执行。CountDownLatch的应用场景CountDownLatch可以被广泛应用于各种多线程协作的场景,例如:主线程等待多个子线程完成后再执行下一步操作。多个子任......
  • 微信小程序导出Excel文件并转发给好友
    需求:小程序的列表页面增加导出功能,点击“批量导出”按钮,则自动生成导出文件,然后自动调起微信好友列表,然后可以将文件发送给微信好友解决方案:由于列表数据是分页加载,所以导出直接由后端同学进行生成并返回url,则我们前端同学只负责下载wx.downloadFile并转发wx.shareFileMessage......