随笔 - 750  文章 - 1  评论 - 107  阅读 - 34万

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

来自:阿里的 通义灵码

使用幂等性设计来防止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。在实际应用中,你可能需要依赖数据库或其他持久化存储来实现幂等性,特别是当处理涉及数据库操作的情况时,你可能需要在数据库级别实现幂等性,例如通过使用唯一约束、事务和回滚逻辑等。

posted on   z5337  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-05-09 [转][C#][VS2019]更改此网站的绑定
2017-05-09 [Java.Web][Servlet]读取配置
2014-05-09 正在进行中效果
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示