2017-07-13 8 views
2

私はPayPal Adaptive Paymentを使用する電子商取引のWebサイトを持っています。アダプティブペイメントはPayPalから生成されるPayKeyを要求して請求書を作成します。データベースの値を待ってから続ける方法

await Task.Run<Task>(async() => 
    { 
     var payResponse = await _payPalApplicationService.ProceedWithPayPal(currentEvent.Id, order.InvoiceId, order.TrackingId, owners.Single(), vModel.TotalPrice, vModel.DeliveryPriceTotal, orderToAdd.TotalTaxes, orderToAdd.SalesRate + orderToAdd.SalesRateTaxes, vModel.SKUViewModels, _payPalApplicationService.PayPalCore._serviceEndPointUrl); 
     order.PayKey = payResponse.payKey; 

     _orderService.Update(order); 
     await _unitOfWorkAsync.SaveChangesAsync(); 
    }); 

問題I:PayKeyを取得するための遅延は、ユーザーが以下のコードを参照してください、PayPalにリダイレクトされる前に、他のいくつかの質問に答える一方で、私は、別のスレッドでコードを置く考えを持っていたように、十分な長さでありますPayPalにリダイレクトされる前にPayKeyが生成されていないように、いくつかのユーザーが十分に速く進むことができます。

ユーザーをPayPalにリダイレクトする前にPayKeyを取得していることを確認するために何かできることは知っていましたか?スレッドタスクは、リダイレクションとは異なるコントローラアクションで実行されます。

は、それは間違いなく、無国籍のMVCの原則に違反しますが、本当に簡単な解決策は、セッションに対してPayKey検索タスクを格納するだろう

デビッド

答えて

2

ありがとうございます。

そうに上記のコードを変更します。そして、あなたが後で他のコントローラとawaitそこにタスクを取得することができます

Session["PaypalTask"] = await Task.Run<Task>(async() => 
{ 
    var payResponse = await _payPalApplicationService.ProceedWithPayPal(currentEvent.Id, order.InvoiceId, order.TrackingId, owners.Single(), vModel.TotalPrice, vModel.DeliveryPriceTotal, orderToAdd.TotalTaxes, orderToAdd.SalesRate + orderToAdd.SalesRateTaxes, vModel.SKUViewModels, _payPalApplicationService.PayPalCore._serviceEndPointUrl); 
    order.PayKey = payResponse.payKey; 

    _orderService.Update(order); 
    await _unitOfWorkAsync.SaveChangesAsync(); 
}); 

。すでに完了している場合は、ただちに発言を続行します。それ以外の場合は、完了するまで待ってから続行してください。

もちろんこの

public async Task<ActionResult> Index() 
{ 
    var payPalTask = Session["PaypalTask"] as Task; 

    await payPalTask; 

    return RedirectToAction("CompltedPayment"); 
} 

のようなものに、あなたはまた、エラーハンドリングなど

UPDATE

を検討する必要があります私は、上記の方法は、メモリ内のセッション状態を保存することを言及する必要があります 。アプリケーションがスティッキーセッションや、redisのような分散キャッシュを調べたいかもしれない複数のサーバーを使用している場合は、いくつかの問題があります。

アップデート2:

私はシンプルTask.Delayhereにして非同期メソッドをあざけるデモを公開しています。このWebアプリケーションを作成して/ InitiatePpに移動すると、要求が開始されます。/PpResult/Resultは実行中のタスクのステータスを返し、/ PpResult/Waitはタスクの完了を待ちます。

+0

回答ありがとうございます。残念ながら、リダイレクトはタスクが完了したかどうかに関係なく行われます。私はpayPalTask​​.Wait()を試した。どちらもうまくいかなかった。 –

+0

Hmmm。私は単純な 'Task.Delay'で非同期関数を模擬してテストしました。最初の関数でも 'await'をやっていないと確信していますか? –

+0

答えにあなたのテストを書き留めますか?私は何かが恋しいと思う。 –

関連する問題