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

时间:2014-11-21 11:35:43

标签: asp.net-mvc-4 shopify asp.net-web-api2

我为shopify创建了一个mvc web api 2 webhook:

public class ShopifyController : ApiController
{
    // PUT: api/Afilliate/SaveOrder
    [ResponseType(typeof(string))]
    public IHttpActionResult WebHook(ShopifyOrder order)
    {
        // need to return 202 response otherwise webhook is deleted
        return Ok(ProcessOrder(order));
    }
}

ProcessOrder遍历订单并将详细信息保存到内部数据库。

但是如果进程花费的时间太长,那么webhook会再次调用api,因为它认为它已经失败了。有没有办法先退回ok响应,然后再进行处理?

有点像在mvc控制器中返回重定向并且可以选择在重定向后继续处理其余操作。

请注意,我总是需要以Shopify的形式返回ok响应,如果它失败了19次就会删除webhook(处理时间过长会被视为失败)

2 个答案:

答案 0 :(得分:8)

我设法通过使用Task异步运行处理来解决我的问题:

    // PUT: api/Afilliate/SaveOrder
    public IHttpActionResult WebHook(ShopifyOrder order)
    {
        // this should process the order asynchronously
        var tasks = new[]
        {
            Task.Run(() => ProcessOrder(order))
        };

        // without the await here, this should be hit before the order processing is complete
        return Ok("ok");
    }

答案 1 :(得分:0)

有几种方法可以完成此操作:

  1. HangfireQuartz之类的任务运行器运行实际的处理,在此过程中,Web请求才开始执行该任务。
  2. 使用队列,例如RabbitMQ来运行实际的进程,并且Web请求只是向队列中添加一条消息...请注意,这可能是最好的,但是可能需要一些重要的专门知识设置。
  3. 虽然可能不完全适合您的特定情况,因为您正在等待另一个进程来等待请求返回...但是,如果没有,则可以使用Javascript AJAX在后​​台启动该进程,也许您可以针对该请求关闭重试...仍然可以使请求继续在后台运行,因此可能不完全是您的一杯茶。