Asp.net-Mvc-4

Web API 2 返回 OK 響應但在後台繼續處理

  • January 15, 2022

我為 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));
   }
}

WhereProcessOrder循環遍歷訂單並將詳細資訊保存到我們的內部數據庫。

但是,如果這個過程花費的時間太長,那麼 webhook 會再次呼叫 api,因為它認為它已經失敗了。有什麼方法可以先返迴ok響應,然後再進行處理?

有點像當您在 mvc 控制器中返回重定向並可以選擇在重定向後繼續處理其餘操作時。

請注意,我將始終需要返回 ok 響應,因為 Shopify 已決定在 webhook 失敗 19 次時刪除它(並且處理時間過長被視為失敗)

我已經設法通過使用以下方式非同步執行處理來解決我的問題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. 讓任務執行者喜歡HangfireQuartz執行實際處理,您的網路請求只是啟動任務。
  2. 使用隊列,例如RabbitMQ,執行實際程序,Web 請求只是將消息添加到隊列中……注意這可能是最好的,但可能需要一些重要的設置知識。
  3. 雖然可能不完全適用於您的具體情況,因為您有另一個程序等待請求返回……但如果您沒有,您可以Javascript AJAX在後台使用啟動程序,也許您可以關閉該請求的重試…仍然使請求在後台繼續進行,因此可能不完全是您的那杯茶。

引用自:https://stackoverflow.com/questions/27060447