Asp.Net WebAPI等待下一个请求执行之前发送当前响应

时间:2019-07-24 13:04:03

标签: c# asp.net asynchronous asp.net-web-api queue

我有一个webApi,它可以获取请求并使用XPO执行数据。根据我的业务逻辑,为避免在同一数据库表上发生冲突,必须按顺序逐个执行每个请求。

老实说,我什么都还没尝试。我对Asp.Net WebAPI的异步方面有些困惑。

下面的代码是在Custom DelegatingHandler中创建响应的一部分。执行base.SendAsync(request, cancellationToken)方法后,我的业务逻辑从相关的System.Web.Http.ApiController类开始。

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
// some logic on request like isUserGranted etc.
//
//
var response = await base.SendAsync(request, cancellationToken);
return buildApiResponse(request, response);
}

可能我在这里有一个误解。如果队列上有请求,我需要等到当前响应完成后才能处理下一个请求。我已经读过有关ConcurrentQueue的信息,但无法实现这种情况。

谢谢。

1 个答案:

答案 0 :(得分:1)

  

根据我的业务逻辑,为避免在同一数据库表上发生冲突,必须按顺序逐个执行每个请求。

这是“悲观锁定”,由于可伸缩性原因,通常认为它不好。如果可能,将业务需求更改为使用“乐观锁定”。

但是,如果您确实要使用悲观锁定,则可以使用异步锁定(SemaphoreSlim)强制一次执行以下行为:

private static readonly SemaphoreSlim Mutex = new SemaphoreSlim(1);

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
  // some logic on request like isUserGranted etc.

  await Mutex.WaitAsync();
  try
  {
    var response = await base.SendAsync(request, cancellationToken);
    return buildApiResponse(request, response);
  }
  finally
  {
    Mutex.Release();
  }
}