【问题标题】:How to implement separate action from async API call?如何从异步 API 调用中实现单独的操作?
【发布时间】:2023-02-26 18:22:24
【问题描述】:

我正在尝试实现一个 API 服务:当站点控制器收到 API 调用时,我希望它检查请求数据并根据请求的数据格式返回成功或失败的响应。

同时,如果请求格式正确,需要在服务端有一个动作A执行,然后向调用者发送一个单独的响应消息,回调URL在调用者的原始请求中指定。如何为单独的动作 A 实现执行线程的生成?

伪代码:

[HttpPost("Api/Action")]
public async Task<IActionResult> MyAction([FromBody] ActionData actionData)
{
    if (actionData == null)
        return new BadRequestObjectResult("Invalid data");
   
     // spawn a thread to handle the action data
    
     return new OkObjectResult("success");
}

public async Task SeparateAction(ActionData actiondata)
{
    // handle the data here
    using (httpClient = new HttpClient())
    {
        // prepare the HTTP response here 
        return await httpClient.PostAsync(...);
    }
}

【问题讨论】:

    标签: c# api


    【解决方案1】:

    如果您想确保在发送初始成功响应后执行操作,那么唯一可靠的解决方案是 basic distributed architecture,如我的博客中所述。具体来说,您需要一个持久队列和一个单独的后台处理器。

    在返回初始响应之前,您的 API 会在队列中放置一条消息。由于这是一个持久队列,因此在返回初始响应之前将消息刷新到磁盘。然后,后台处理器从该队列中获取消息,对其进行处理(包括发送最终处理过的通知),然后将其删除。

    只是分离一个单独的线程或使用内存中的队列可能会在进程关闭时(例如,在滚动升级期间)导致工作丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 2011-02-01
      • 2016-04-07
      相关资源
      最近更新 更多