如何防止多次调用API调用

时间:2015-09-26 18:48:28

标签: c# asp.net entity-framework api

我有一个app +网站,它使用API​​,您可以购买虚拟货币的商品。

当您购买商品时,您可以退款并退款。

下面是一些伪代码来解释。

API /顺序/退款/ {订单ID}

if(order.status == accepted)
{
    order.status = refunded;
    user.AddMoney(order.Amount);
    dbcontext.saveChanges();
}

问题是,如果API像api / order / refund / 21一样被多次调用,它会在saveChanges()之前运行;是成功的将AddMoney();对同一订单不止一次给用户。

有人知道这方面的解决方案吗?

由于

3 个答案:

答案 0 :(得分:0)

使用下面示例中的锁

private Object thisLock = new Object();
if(order.status == accepted)
{
 lock(thisLock)
{

 if(order.status == accepted)
 {
  order.status = refunded;
  user.AddMoney(order.Amount);
  dbcontext.saveChanges();

 }
}    
}

答案 1 :(得分:0)

我最终这样做了:

 var vctx = new VenueContext();
        using(var dbtransaction = vctx.Database.BeginTransaction(IsolationLevel.RepeatableRead))
        {
            try
            {
                var order = vctx.Orders.Include("Venue").Include("Transactions.MenuItem").FirstOrDefault(x => x.Id == orderid);
                if (order.StatusId != 1)
                {
                    return false;
                }
                if (status == 3 || status == 4)
                {
                    vctx = MoneyRepository.AddMoney(order.UserId, order.Total * -1, vctx);
                }
                order.StatusId = status;
                vctx.SaveChanges();
                dbtransaction.Commit();
            }
            catch (Exception)
            {
                dbtransaction.Rollback();
                return false;
            } 
        }
        return true;
    }

答案 2 :(得分:0)

我以https://github.com/stefanprodan/WebApiThrottle结尾,您可以用它来限制所选端点上的请求量。