我为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(处理时间过长会被视为失败)
答案 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)
有几种方法可以完成此操作:
Hangfire
或Quartz
之类的任务运行器运行实际的处理,在此过程中,Web请求才开始执行该任务。RabbitMQ
来运行实际的进程,并且Web请求只是向队列中添加一条消息...请注意,这可能是最好的,但是可能需要一些重要的专门知识设置。Javascript AJAX
在后台启动该进程,也许您可以针对该请求关闭重试...仍然可以使请求继续在后台运行,因此可能不完全是您的一杯茶。