【问题标题】:Asp.Net WebAPI Wait the Current Response Sent before Next Request ExecutedAsp.Net WebAPI 在执行下一个请求之前等待当前发送的响应
【发布时间】:2019-07-24 13:04:03
【问题描述】:

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

老实说,我还不能尝试任何东西。我对 Asp.Net WebAPI 的异步方面有点困惑。

下面的代码是在自定义 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 但不知道如何在这种情况下实现它。

提前致谢。

【问题讨论】:

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


    【解决方案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();
      }
    }
    

    【讨论】:

    • 我要求理解。每个请求都会创建一个我的 DelegatingHandler 实例,如果这些行上还有另一个执行,这个静态 SemaphoreSlim 对象将等待,对吗?那么,如果是,是否按顺序排列?
    • SemaphoreSlim 将使它们一次运行一个。顺序大致是先进先出,但不保证。
    • 您的建议让我做了进一步的搜索,所以谢谢。但是为什么我不应该使用带有 lock 关键字的锁对象呢?
    • @Gogo-the-Cat:因为代码不能await同时持有lock
    • 看起来SemaphoreSlim 正在为我的案子做它的工作。而且它不是 FIFO 保证的,它与他们要求的顺序不同。感谢您的分享。我会将此答案标记为解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2012-09-27
    • 2017-11-24
    相关资源
    最近更新 更多