0

現在ECサイトを運営しています。

そのため、ユーザーがチェックアウトすると、銀行のコールバック ページが表示されます...

しかし、支払いが発生した後に長いタスクを実行する必要があるため (現在は同期的に実行されています)、ユーザーは私のサイトにリダイレクトされるまで長い時間待たなければなりません。

thread.start を使用してバックグラウンド スレッドを作成しようとしましたが、問題は、セッションが失われることです。

では、この説明に基づいて、どのように進めますか? 非同期またはマルチスレッドにしますか?

あなたが非同期に行くとしたら、それはどうですか?

したがって、次のようなものがあります。

public ActionResult CallBack()
{
    if (AcceptPayment() == "OK")
    {
      LenghtyTask(); 
    }

    return RedirectToUrl("MyWebSite");   
} 
4

3 に答える 3

3

まず第一に、アプリケーションの有効期間を制御できないため、ASP.NET サイトでバックグラウンド スレッドを実行することは絶対にできません。アプリケーション プールがシャットダウンまたはリサイクルされる可能性があるため、データが失われます。

データベースを使用してタスクを保存する (およびジョブの進行に合わせて状態を更新する) か、単純に Windows サービスなどを作成してジョブを実行することができます。


実行中のジョブを制御できないため、非同期またはスレッドを使用する必要があるかどうかを尋ねるのは無意味です。どちらもリソースを解放しないためです (つまり、アプリケーションの実行を高速化します)。

知っているものを選択するだけで、HTTP 要求が完了します。ジョブがバックグラウンドで処理されていることをユーザーに伝え、ブラウザーを更新して進行状況を確認できるようにします。別の方法は、Ajax または ASP.NET SignalR を使用して、バックグラウンドで進行状況を確認することです。

于 2013-07-22T19:39:34.733 に答える
0

おそらくこのようなものになるでしょう

public ActionResult CallBack()
{
    if (AcceptPayment() == "OK")
    {
        // simply launches the task and moves on
        Task.Run(LenghtyTask()); 
    }

    return RedirectToUrl("MyWebSite");   
} 

今あなたのページに: RedirectToUrl("MyWebSite")

Tejsが指摘したように、タスクが終了したときにユーザーに通知できるajaxリクエストをセットアップする必要があります

public ActionResult IsTaskFinished()
{
    // No clue where your transaction is, but your gonna need to know it to check it's state
    return JSON(SomeClass.Current.IsTaskFinished(ContextBoundObject.Transaction.Id));
} 

SomeClass.Current.IsTaskFinished(ContextBoundObject.Transaction.Id)トランザクションが既に終了している場合に備えて、実際に ajax を起動する前に /MyWebSite を呼び出したいと思うでしょう。

function isTaskFinished() {
    $.post("/IsTaskFinished").always(function(data) {
        if (!!data) {
            setTimout(isTaskFinished, 3000);
        }
        else {
            // yay i'm done, inform user !
        }
    });
}

もちろん、再試行の制限、エラー処理などを考慮に入れる必要があります。

于 2013-07-22T19:48:59.410 に答える
-1

時間のかかる操作をキュー (MSMQ、RabbitMQ など) にスタックし、ワーカー プロセス (できれば Windows サーバー) を使用してジョブをデキューし、時間のかかる操作を実行します。

ユーザーに通知する方法に関しては、いくつかのオプションがありますが、私が選択したのは、サーバーを介してクライアント ブラウザーにプッシュできるリアルタイムの更新です。アプリケーションに SignalR エンドポイントを配置し、ワーカー プロセスの SignalR .NET クライアントを介して接続するだけです。時間のかかる操作が完了したら、SignalR エンドポイントを介して接続されたクライアントに通知できます。

何をするにしても、@jgauffinが指摘したように、IMHOのデータクリティカルな操作については、ASP.NETでのバックグラウンド操作を避けてください。理由は次のとおりです

于 2013-07-22T19:53:07.080 に答える