如何回答请求但继续在 WebApi 中处理代码

Posted

技术标签:

【中文标题】如何回答请求但继续在 WebApi 中处理代码【英文标题】:How to answer a request but continue processing code in WebApi 【发布时间】:2014-10-06 02:24:57 【问题描述】:

我想回答请求,但继续处理代码。

我尝试了类似的方法:

[HttpPost]
public async Task<HttpResponseMessage> SendAsync(MyRequest sms)

    await Task.Run(() => Process(sms)); //need to run in a separate thread
    var response = new MyRequest(sms)  Ack = true ;
    return Request.CreateResponse(HttpStatusCode.Created, response.ToString());


private async void Process(MyRequest sms)

    var validationResult = new MyRequestValidation(_p2pContext, _carrierService).Validate(sms);
    if (string.IsNullOrWhiteSpace(validationResult.Errors[0].PropertyName)) // Request not valid
        return;

    Message msg;

    if (validationResult.IsValid)
    
        msg = await _messageService.ProcessAsync(sms);
    
    else // Create message as finished
    
        msg = _messageService.MessageFromMyRequest(sms,
                finished: true,
                withEventSource: validationResult.Errors[0].CustomState.ToString()
              );
    

    // Salve in db
    _p2pContext.MessageRepository.Create(msg);
    _p2pContext.Save();

【问题讨论】:

如果您想快速返回 202 响应并继续执行代码,可以使用 AMQP/rabbitmq 或 kafka 消息传递 【参考方案1】:

我想回答一个请求,但继续处理代码。

您确定要在 ASP.NET 中执行此操作吗?这不是 ASP.NET(或任何 Web 服务器)旨在处理的情况。

执行此操作的经典(正确)方法是将工作排队到持久队列,并让一个单独的后端进程执行该工作的实际处理。

在请求上下文之外的 ASP.NET 内部进行处理存在各种危险。一般来说,你不能假设工作会真正完成。如果您对此感到满意(或者只是喜欢危险地生活),那么您可以使用HostingEnvironment.QueueBackgroundWorkItem

我有一个blog post,它更详细。

【讨论】:

相信我,我不会这样做!我会读你的帖子。 优秀的帖子!我选择使用 Hangfire。谢谢。

以上是关于如何回答请求但继续在 WebApi 中处理代码的主要内容,如果未能解决你的问题,请参考以下文章

webapi方式

如何使用自定义消息处理错误请求 Web api 核心?

Web API 2 返回 OK 响应但在后台继续处理

跨域 WebAPI 批量请求

如何在Windows Server2008R2中部署WebAPI

如何使用 http 请求从 WebAPI 返回 JSON?