[英]ASP.NET Core WebApi return response after queue processing
我有一个将某些实体称为POST的终结点,称为Entry。 这些条目具有一个名为OrderNumber的属性,该属性是一个1-n的数字,该数字基于今天已经发生的条目确定。 因此,当数据库中当天有100个条目时,新的OrderNumber应该为101。
因此,当您从不同的设备(X和Y)两次击中端点时会发生什么:
X.发送一个条目
X.向数据库询问当前条目->响应为100
Y.发送条目
Y.向数据库询问当前条目->响应为100
X.记录将插入订单号101
Y.记录将插入订单号101
我的解决方案是使用队列创建后台任务(如此处所示: https : //docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/hosted-services?view = aspnetcore-2.1#queued- background-tasks )并在此处创建条目,以确保它们被依次处理。
现在,控制器中的问题是,在请求期间,我无法返回带有正确的OrderNumber的最新条目,因为只要队列处理了该条目,它就会发生。
那么客户端如何正确地获得响应呢? 还是有更好/不同的方式来处理这些情况?
自定义属性代码在这里:
public class SingleThreadAttribute : ActionFilterAttribute
{
private static Object _thisLock = new Object();
public override void OnActionExecuting(ActionExecutingContext context)
{
Monitor.Enter(_thisLock);
base.OnActionExecuting(context);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
Monitor.Exit(_thisLock);
}
}
通过在控制器的动作端点上添加[SingleThread]
属性,如果同时进行多个调用,则它们将在等待上一个调用释放锁的同时被处理。
这可以解决您的情况。
我刚刚找到了这个stackoverflow答案,似乎可以解决我的问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.