Asp.net-Mvc-4
Web API 2 返回 OK 響應但在後台繼續處理
我為 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)); } }Where
ProcessOrder循環遍歷訂單並將詳細資訊保存到我們的內部數據庫。但是,如果這個過程花費的時間太長,那麼 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"); }
有幾個選項可以做到這一點:
- 讓任務執行者喜歡
Hangfire或Quartz執行實際處理,您的網路請求只是啟動任務。- 使用隊列,例如
RabbitMQ,執行實際程序,Web 請求只是將消息添加到隊列中……注意這可能是最好的,但可能需要一些重要的設置知識。- 雖然可能不完全適用於您的具體情況,因為您有另一個程序等待請求返回……但如果您沒有,您可以
Javascript AJAX在後台使用啟動程序,也許您可以關閉該請求的重試…仍然使請求在後台繼續進行,因此可能不完全是您的那杯茶。