队列处理后,ASP.NET Core WebApi返回响应

时间:2018-11-16 18:58:15

标签: c# asp.net-core concurrency background-process

我有一个端点,该端点将某些实体称为POST,称为Entry。这些条目具有一个名为OrderNumber的属性,该属性是一个1-n的数字,该数字基于今天已经发生的条目确定。因此,当数据库中当天有100个条目时,新的OrderNumber应该为101。

那么当您从不同的设备(X和Y)两次击中端点时会发生什么:

X。发送条目

X。向数据库询问当前条目->回复100

Y。发送条目

Y。向数据库询问当前条目->回复100

X。记录将插入OrderNumber 101

Y。记录将插入OrderNumber 101

我的解决方案是创建一个具有队列的后台任务(如此处https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1#queued-background-tasks所示)并在其中创建条目,以确保它们被依次处理。

现在控制器中的问题是,我无法在请求期间返回带有正确的OrderNumber的最新条目,因为只要队列处理了该条目,它就会发生。

那么客户端如何正确获得响应?还是有更好/不同的方式来处理这些情况?

2 个答案:

答案 0 :(得分:0)

此处的自定义属性代码:

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]属性,如果同时进行多个调用,则它们将在等待上一个调用释放锁的同时被处理。

这可以解决您的情况。

答案 1 :(得分:0)

我刚刚找到了这个stackoverflow答案,似乎可以解决我的问题:

How to protect resources that may be used in a multi-threaded or async environment?